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

使用gcc或Clang编译C源代码时,我始终使用-g标志为gdb生成debugging信息。

gcc -g -o helloworld helloworld.c

我注意到有人推荐-g3-g-g3标志有什么-g3-g-ggdb也有区别吗?

从文档 :

-G

以操作系统的本机格式(插入,COFF,XCOFF或DWARF 2)生成debugging信息。 GDB可以使用这个debugging信息。 在大多数使用stabs格式的系统上,-g使用额外的debugging信息,只有GDB可以使用; 这些额外的信息使得在GDB中的debugging工作变得更好,但可能会使其他debugging器崩溃或拒绝读取程序。 如果要控制是否生成额外信息,请使用-gstabs +,-gstabs,-gxcoff +,-gxcoff或-gvms(请参见下文)。


-ggdb

生成供GDB使用的debugging信息。 这意味着要使用可用的最具performance力的格式(DWARF 2,stabs,或者如果它们都不被支持,则使用本地格式),如果可能的话,包括GDB扩展。


-gvmslevel

请求debugging信息并使用级别指定多less信息。 默认级别是2.级别0根本不产生debugging信息。 因此,-g0否定-g。

….

级别3包含额外信息,例如程序中的所有macros定义。 有些debugging器在使用-g3时支持macros扩展。

tl; dr:为了回答你的具体问题, -g3 “包含了额外的信息,比如macros定义,有些debugging器在使用-g3时支持macros扩展,而-g不支持。

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

指定-g等同于-g2 。 奇怪的是, -g2 文件很less说什么信息-g / -g2包括或排除在外。

请求debugging信息并使用级别指定多less信息。 默认级别是2.级别0根本不产生debugging信息。 因此,-g0否定-g。

级别1产生最less的信息,足以在您不打算debugging的程序部分中进行回溯。 这包括函数和外部variables的描述,以及行号表,但没有关于局部variables的信息。

级别3包含额外信息,例如程序中的所有macros定义。 有些debugging器在使用-g3时支持macros扩展。