在gcc编译时,不使用-g
选项和使用-g0
选项之间有什么区别?为什么要在gcc中使用-g0
选项?我尝试编译并在GDB中发现两种情况下都出现了"无调试符号"的消息。
所以,如果您需要调试信息,请不要使用
-g
level
…请求调试信息,并使用level指定要使用多少信息。默认级别为2。
级别0根本不生成调试信息。因此,
-g0
会取消-g
的效果。
-g0
。如果您确实需要调试信息,请记得在创建对象文件(-c
)和链接程序时都使用-g
选项。-g
编译和使用-g0
编译是等效的,结果二进制文件中没有调试信息 - 正如您通过实验发现的那样。从手册中得知:
-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
。优化代码采取的快捷方式可能会偶尔产生令人惊讶的结果:一些您声明的变量可能根本不存在;控制流可能会短暂地移动到您没有预料到的位置;一些语句可能不会执行,因为它们计算出常量结果或者它们的值已经在手头;一些语句可能会在不同的位置执行,因为它们已经从循环中移出。
尽管如此,调试优化输出是可行的。这使得对于可能有缺陷的程序使用优化器变得合理。