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

问题描述 投票:0回答:2

当使用 gcc 或 Clang 编译 C 源代码时,我总是使用

-g
标志来生成 gdb 的调试信息。

gcc -g -o helloworld helloworld.c

我注意到有些人推荐

-g3
-g
-g3
标志有什么区别?还有
-g
-ggdb
之间有区别吗?

c debugging gcc gdb clang
2个回答
135
投票

来自文档

-g

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

...


-ggdb

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


-gvmslevel

请求调试信息,同样使用level来指定信息量的大小。默认级别为 2。级别 0 不产生 根本没有调试信息。因此,-g0 否定 -g。

....

第 3 级包括额外信息,例如所有宏定义 出现在节目中。某些调试器支持宏扩展 你使用-g3。


60
投票

tl;dr: 要回答您的具体问题,

-g3
“包含额外信息,例如程序中存在的所有宏定义。当您使用
-g3
时,某些调试器支持宏扩展”,而
-g
不支持包含此额外信息。

更广泛的答案是 gcc 支持四个级别的调试信息,从

-g0
(禁用调试信息)到
-g3
(最大调试信息)。

指定

-g
相当于
-g2
。奇怪的是,gcc 文档很少提及
-g
/
-g2
包含或排除哪些信息:

请求调试信息,同样使用level来指定信息量的大小。默认级别为 2。 级别 0 根本不产生任何调试信息。因此,-g0 否定 -g。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.