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


102

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

gcc -g -o helloworld helloworld.c

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


15
我之所以来到这里,是因为我使用的是其他人的makefile,而文档是从头开始的。关于StackOverflow的好问题,可以从Google找到一个简单的答案。
GreenAsJade

只要您愿意深入研究,就会有大量关于SO的问题被“发现”。这不是驳回问题的正当理由。
BeeOnRope

Answers:


104

文档

-G

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

...


-ggdb

产生调试信息以供GDB使用。这意味着要使用可用的最具表现力的格式(DWARF 2,stab或本机格式(如果都不支持),包括GDB扩展名)。


-gvmslevel

请求调试信息,并使用级别指定多少信息。默认级别为2。级别0完全不产生调试信息。因此,-g0取反-g。

....

级别3包含其他信息,例如程序中存在的所有宏定义。使用-g3时,某些调试器支持宏扩展。


8
还能解释例如“最具表现力的格式”和“额外信息”之间的区别吗?这些参数是互补的吗?他们中许多人提到GDB ...谢谢!
rogerdpack 2015年

28

tl; dr:要回答您的特定问题,-g3“包括一些额外的信息,例如宏定义...某些调试器在使用-g3“ 时支持宏扩展,而-g没有包括这些额外的信息。

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

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

请求调试信息,并使用级别指定多少信息。默认级别为2。级别0完全不产生调试信息。因此,-g0取反-g。

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

级别3包含其他信息,例如程序中存在的所有宏定义。使用-g3时,某些调试器支持宏扩展。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.