129

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

gcc -g -o helloworld helloworld.c

我注意到有些人推荐-g3-g-g3标志有什么区别?-g和之间也有区别-ggdb吗?

4

2 回答 2

122

文档

-G

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

...


-ggdb

生成供 GDB 使用的调试信息。这意味着使用最具表现力的可用格​​式(DWARF 2、stabs 或本机格式,如果它们都不支持),如果可能的话,包括 GDB 扩展。


-gvms级别

请求调试信息并使用 level 指定多少信息。默认级别为 2。级别 0 根本不产生任何调试信息。因此,-g0 否定 -g。

……

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

于 2012-05-06T23:13:41.700 回答
40

tl;dr:要回答您的具体问题,-g3“包括宏定义等额外信息......某些调试器在您使用时支持宏扩展-g3”,但-g不包括此额外信息。

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

指定-g等同于-g2。奇怪的是,gcc 文档-g很少提及/-g2包含或排除哪些信息:

请求调试信息并使用 level 指定多少信息。默认级别为 2。级别 0 根本不产生任何调试信息。因此,-g0 否定 -g。

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

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

于 2016-03-25T18:29:48.857 回答