当使用 gcc 或 Clang 编译 C 源代码时,我总是使用
-g
标志来生成 gdb 的调试信息。
gcc -g -o helloworld helloworld.c
我注意到有些人推荐
-g3
。 -g
和 -g3
标志有什么区别?还有-g
和-ggdb
之间有区别吗?
来自文档:
-g
以操作系统的本机格式(stabs、COFF、XCOFF 或 DWARF 2)生成调试信息。 GDB 可以用这个 调试信息。在大多数使用 stats 格式的系统上,-g 允许使用只有 GDB 才能使用的额外调试信息;这 额外的信息可以使 GDB 中的调试工作得更好,但可能 使其他调试器崩溃或拒绝读取程序。如果你想 要确定是否生成额外信息,请使用 -gstabs+、-gstabs、-gxcoff+、-gxcoff 或 -gvms(见下文)。
...
-ggdb
生成供 GDB 使用的调试信息。这意味着使用最具表现力的可用格式(DWARF 2、stabs 或本机 格式(如果都不支持),包括 GDB 扩展(如果 完全有可能。
-gvmslevel
请求调试信息,同样使用level来指定信息量的大小。默认级别为 2。级别 0 不产生 根本没有调试信息。因此,-g0 否定 -g。
....
第 3 级包括额外信息,例如所有宏定义 出现在节目中。某些调试器支持宏扩展 你使用-g3。
tl;dr: 要回答您的具体问题,
-g3
“包含额外信息,例如程序中存在的所有宏定义。当您使用-g3
时,某些调试器支持宏扩展”,而-g
不支持包含此额外信息。
更广泛的答案是 gcc 支持四个级别的调试信息,从
-g0
(禁用调试信息)到 -g3
(最大调试信息)。
指定
-g
相当于 -g2
。奇怪的是,gcc 文档很少提及-g
/-g2
包含或排除哪些信息:
请求调试信息,同样使用level来指定信息量的大小。默认级别为 2。 级别 0 根本不产生任何调试信息。因此,-g0 否定 -g。
级别 1 产生最少的信息,足以在您不打算调试的程序部分中进行回溯。这包括函数和外部变量的描述以及行号表,但没有有关局部变量的信息。
第 3 级包含额外信息,例如程序中存在的所有宏定义。当您使用 -g3 时,某些调试器支持宏扩展。