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

haz*_*ziz 94 c debugging gcc gdb clang

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

gcc -g -o helloworld helloworld.c

我注意到有些人建议-g3改为.-g-g3旗帜有什么区别?-g-ggdb?之间有区别吗?

MBy*_*ByD 94

来自文档:

-G

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

...


-ggdb

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


-gvmslevel

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

....

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

  • 可以解释一下例如"最具表现力的格式"和"额外信息"之间的区别是什么?这些参数是免费的吗?他们中的很多人都提到了GDB ......谢谢! (8认同)

U00*_*07D 24

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

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

指定-g相当于-g2.奇怪的是,gcc文档几乎没有说明什么信息-g/ -g2包含或排除:

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

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

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