gcc -g0和不带-g选项的区别是什么?

4

在gcc编译时,不使用-g选项和使用-g0选项之间有什么区别?为什么要在gcc中使用-g0选项?我尝试编译并在GDB中发现两种情况下都出现了"无调试符号"的消息。

2个回答

8
如果您查看GCC手册,可以在此处找到以下内容:

-glevel

请求调试信息,并使用level指定要使用多少信息。默认级别为2。

级别0根本不生成调试信息。因此,-g0会取消-g的效果。

所以,如果您需要调试信息,请不要使用-g0。如果您确实需要调试信息,请记得在创建对象文件(-c)和链接程序时都使用-g选项。
而完全不使用-g编译和使用-g0编译是等效的,结果二进制文件中没有调试信息 - 正如您通过实验发现的那样。

2

手册中得知:

-glevel

-ggdblevel

-gstabslevel

-gcofflevel

-gxcofflevel

-gvmslevel

请求调试信息并使用level指定信息的详细程度。默认级别为2。

级别0不产生任何调试信息。因此,-g0取消了-g

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

级别3包括额外的信息,例如程序中存在的所有宏定义。一些调试器支持在使用-g3时进行宏扩展。

-gdwarf-2不接受连接的调试级别,因为GCC曾经支持一个选项-gdwarf,用于在DWARF格式版本1中生成调试信息(与版本2非常不同),这将会非常混乱。该调试格式已经过时,但现在无法更改该选项。而是使用额外的-glevel选项来更改DWARF的调试级别。

为了完整起见,默认级别-g/-g2如下:

-g

生成操作系统本地格式的调试信息(stabs、COFF、XCOFF或DWARF 2)。GDB可以使用此调试信息。

在大多数使用stabs格式的系统上,-g启用了只有GDB可以使用的额外调试信息;这些额外信息使得在GDB中进行调试更加有效,但可能会导致其他调试器崩溃或拒绝读取程序。如果您想要控制是否生成额外的信息,请使用-gstabs+-gstabs-gxcoff+-gxcoff-gvms(参见下文)。

GCC允许您在-O选项下使用-g。优化代码采取的快捷方式可能会偶尔产生令人惊讶的结果:一些您声明的变量可能根本不存在;控制流可能会短暂地移动到您没有预料到的位置;一些语句可能不会执行,因为它们计算出常量结果或者它们的值已经在手头;一些语句可能会在不同的位置执行,因为它们已经从循环中移出。

尽管如此,调试优化输出是可行的。这使得对于可能有缺陷的程序使用优化器变得合理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接