【问题标题】:Expose debugging symbols for a program compiled with multiple languages公开使用多种语言编译的程序的调试符号
【发布时间】:2016-06-10 15:24:19
【问题描述】:

按照官方说明,要编译一个支持调试的程序,你可以运行

g++ -std=c++11 -O0 -g -c -o program1.o program1.cpp 

现在用 C 程序做同样的事情,它只是:

gcc -O0 -g -c -o program2.o program2.c

为了将两种类型联系在一起,我可以使用:

g++ --std=c++11  -O0 -g -o program program.o program2.o

然后,调试:

gdb program
gdb > run <PARAMS>

在多次尝试修改编译器选项后,它完全工作了(上述选项适用于工作版本)。在某些情况下,C 符号会加载,但 C++ 符号不会。

有人可以解释一下推荐的选项是什么,以便为混合多种编译语言的非平凡示例启用调试?所有文档仅涉及琐碎的示例。

【问题讨论】:

  • 与您的问题无关,但可执行程序不应具有 .so 后缀,它用于 共享对象(即动态库或 DLL)。在 Linux 或 OSX 等 POSIX 系统上,可执行程序通常没有后缀。
  • 至于你的问题,GCC 总是使用-g 选项来添加调试信息,不管是什么语言。使用-O0 禁用优化也是一个好主意。就是这样。
  • 链接步骤也需要-g 选项。如果要通过gdb 进行调试,那么编译和链接步骤的正确选项是-ggdb,因为这样可以提供更多gdb 可以使用的信息。
  • 当编译/链接语句缺少-std=... 选项时,编译器将使用默认标准。 (通常是 c89 或类似的)所以所有对 gcc(和/或 g++)的调用都应该引用适当的标准。
  • gdb 实用程序只有在与可执行文件位于同一目录时才能自动找到源文件。对于所有其他情况,必须专门加载源文件。

标签: c++ c gcc gdb


【解决方案1】:

请注意,如果您只使用-g 选项,那么编译器将使用操作系统的本机格式,该格式可能会有所不同。您可以使用其他-g... 变体(例如-gdwarf-3-g-stabs)来显式指定格式。这使您可以保证您的目标文件都具有一致的调试格式,无论它们是在哪里构建的。

如果您希望使用其他调试器,您也可以使用此方法禁用 gdb-only 扩展。详情请见this

【讨论】:

    【解决方案2】:

    在每个编译和链接步骤中,将-g 选项添加到编译器标志。 -O0 也推荐用于调试版本,这样您就不会失去编译器优化功能。不一致可能导致没有调试符号或部分调试符号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 2011-03-24
      • 2014-02-11
      相关资源
      最近更新 更多