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扩展。