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