【问题标题】:Is there a way to identify whether a program has -ggdb provided as a gcc option?有没有办法确定程序是否将 -ggdb 作为 gcc 选项提供?
【发布时间】:2021-11-25 16:24:55
【问题描述】:

在我的 C++ 程序中,我使用两种类型的构建。一种是没有调试信息的优化构建 (gcc -O3 ),另一种是具有调试信息的优化构建 (gcc -ggdb -O3 )。在我的程序中,我使用 dlopen ("library_name", RTLD*) 来加载一些共享库。这些共享库也有相同的两个版本。

现在我的问题是我是否可以在我的代码中找到 -ggdb 选项是否包含在构建中,以便我可以执行以下操作。

if (with_debug_info_build)//Need some way to identify whether -ggdb is provided
{
     void* h = dlopen("my_library.od.so", RTLD*);//Load library with debug info
}
else
{
      void* h = dlopen("my_library.so", RTLD*);//Load library without debug info
}

非常感谢您在这方面的帮助。谢谢。

【问题讨论】:

  • 我认为在执行调试编译的二进制文件(或将其编译成二进制文件)时,将LD_LIBRARY_PATH设置为指向调试编译的库路径会更好。如果您开始在代码中进行这些检查,您的调试版本将开始偏离最终的二进制文件。注意:您可以检查#ifdef NDEBUG/* release build */#else/* debug build */#endif
  • 这是一个不错的选择,泰德。尽管在我的情况下使用调试信息进行了优化也定义了 ndebug,但我也可以使用单独的宏。谢谢!
  • 不客气!请注意,我提到了一些你可以这样做,但我建议不要这样做,而是通过@为二进制文件提供不同的环境来管理加载的库987654328@。它会更容易维护,并且不会用#ifdefs 混淆你的代码。

标签: c++ gcc shared-libraries


【解决方案1】:

在我的 C++ 程序中,我使用两种类型的构建。一种是没有调试信息的优化构建(gcc -O3),另一种是有调试信息的优化构建(gcc -ggdb -O3)。

不是直接回答您的问题,但上述设置通常是错误解决它试图解决的任何问题的方法。

您应该做的是使用-O3 -ggdb 进行single 构建,用于开发和调试,以及将整个安装目录复制到单独的“发布”目录并运行的方法strip -g 在“发布”目录中的所有二进制文件上。

二进制文件应从其相应的安装树加载共享库(这很容易实现,例如,-Wl,-rpath='$ORIGIN/../lib',如果二进制文件是 ${dir}/bin/exe 并且您希望它使用 ${dir}/lib 共享库)。

优点:

  • 您可以将发布的二进制文件发送到您需要的任何地方,并且仍然可以访问完全匹配的完整调试信息
  • 不要乱用LD_LIBRARY_PATH——“正确”的库版本会自动加载

现在我的问题是我是否可以在我的代码中找到 -ggdb 选项是否包含在构建中?

是的,你可以。为此,您需要解析磁盘上的可执行文件,并确定它是否有调试信息。

这是特定于平台的。假设您有一个 ELF 文件,您可以解析它的节表,查找名为 .debug_info.debug_line 等的节)。如果您将-frecord-gcc-switches 添加到您的编译行,您还可以阅读.GCC.command.line 部分以查找使用的命令行,例如

gcc -g -O3 t.c -frecord-gcc-switches

readelf -x.GCC.command.line a.out

Hex dump of section '.GCC.command.line':
  0x00000000 2d696d75 6c746961 72636820 7838365f -imultiarch x86_
  0x00000010 36342d6c 696e7578 2d676e75 00742e63 64-linux-gnu.t.c
  0x00000020 002d6d74 756e653d 67656e65 72696300 .-mtune=generic.
  0x00000030 2d6d6172 63683d78 38362d36 34002d67 -march=x86-64.-g
  0x00000040 002d4f33 002d6672 65636f72 642d6763 .-O3.-frecord-gc
  0x00000050 632d7377 69746368 6573002d 66617379 c-switches.-fasy
  0x00000060 6e636872 6f6e6f75 732d756e 77696e64 nchronous-unwind
  0x00000070 2d746162 6c657300                   -tables.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-16
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多