在使用gcc或Clang编译C源代码时,我总是使用-g
标志为gdb生成调试信息。
gcc -g -o helloworld helloworld.c
我注意到有些人推荐-g3
。-g
标志和-g3
标志有什么区别?另外,-g
和-ggdb
之间有区别吗?
发布于 2012-05-07 07:13:42
从docs
-g
以操作系统的本机格式(stabs、COFF、XCOFF或DWARF 2)生成调试信息。GDB可以使用这些调试信息。在大多数使用stabs格式的系统上,-g允许使用只有GDB才能使用的额外调试信息;这些额外信息使GDB中的调试工作更好,但可能会使其他调试器崩溃或拒绝读取程序。如果您想确定是否生成额外的信息,请使用-gstabs+、-gstabs、-gxcoff+、-gxcoff或-gvms (如下所示)。
..。
-ggdb
生成调试信息以供GDB使用。这意味着使用可用的最具表现力的格式(DWARF 2、stabs或本机格式,如果这两种格式都不受支持),如果可能的话,包括GDB扩展。
-gvmslevel
请求调试信息,并使用level指定有多少信息。默认级别为2。级别0根本不生成调试信息。因此,-g0否定了-g。
……
Level 3包括额外的信息,例如程序中存在的所有宏定义。当您使用-g3时,某些调试器支持宏扩展。
发布于 2016-03-26 02:29:49
tl;dr:要回答您的特定问题,-g3
“包括额外的信息,如宏定义...当您使用-g3
时,某些调试器支持宏扩展”,而-g
不包括这些额外的信息。
更广泛的答案是,从-g0
(禁用调试信息)到-g3
(最大调试信息),gcc支持四个级别的调试信息。
指定-g
等效于-g2
。奇怪的是,gcc docs很少提及-g
/-g2
包含或排除了哪些信息:
请求调试信息,并使用level指定有多少信息。默认级别为2。级别0根本不生成调试信息。因此,-g0否定了-g。
级别1生成的信息最少,足以在您不打算调试的部分程序中进行回溯。这包括对函数和外部变量的描述,以及行号表,但不包括有关局部变量的信息。
Level 3包括额外的信息,例如程序中存在的所有宏定义。当您使用-g3时,某些调试器支持宏扩展。
https://stackoverflow.com/questions/10475040
复制相似问题