GCC-g vs-g3 GDB 标志: 有什么区别?

在使用 gcc 或 Clang 编译 C 源代码时,我总是使用 -g标志为 gdb 生成调试信息。

gcc -g -o helloworld helloworld.c

我注意到有些人推荐使用 -g3-g-g3标志的区别是什么?-g-ggdb之间有区别吗?

77859 次浏览

来自 医生:

G

以操作系统的本机格式(stabs、 COFF、 XCOFF 或 DWARF2)生成调试信息 调试信息。在大多数使用 stabs 格式的系统上,-g 允许使用只有 GDB 可以使用的额外调试信息; 额外的信息使调试工作在 GDB 中更好,但可能 使其他调试器崩溃或拒绝读取程序 为了控制是否生成额外的信息,请使用 - gstabs + 、-gstabs、-gxcoff + 、-gxcoff 或-gvms (见下文)。

...


- 谢谢

生成供 GDB 使用的调试信息。这意味着使用可用的最具表现力的格式(DWARF2、 stabs 或原生的 格式) ,包括 GDB 扩展,如果 尽一切可能。


- Gvmslevel

请求调试信息,并使用级别指定多少信息。默认级别为2。0级生成否 调试信息。因此,-g0否定-g。

....

第3级包括额外的信息,例如所有宏定义 一些调试器在下列情况下支持宏扩展 你用-g3。

为了回答你的具体问题,-g3“包含额外的信息,比如宏定义... ... 一些调试器在使用 -g3时支持宏扩展”,而 -g不包含这些额外的信息。

更广泛的答案是,gcc 支持四个级别的调试信息,从 -g0(禁用调试信息)到 -g3(最大调试信息)。

指定 -g等同于 -g2。奇怪的是,GCC 文件很少说明 -g/-g2包含或排除了哪些信息:

请求调试信息,并使用级别指定信息量。默认级别为2。 级别0根本不产生调试信息。

第1级产生的信息最少,足以在程序中不计划调试的部分进行回溯。这包括函数和外部变量的描述,以及行号表,但是没有关于本地变量的信息。

第3级包括额外的信息,例如程序中的所有宏定义。有些调试器在使用 -g3时支持宏扩展。