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

时间:2012-05-06 23:08:19

标签: c debugging gcc gdb clang

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

gcc -g -o helloworld helloworld.c

我注意到有人推荐-g3-g-g3标志之间有什么区别? -g-ggdb之间是否存在差异?

2 个答案:

答案 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时,某些调试器支持宏扩展。