您的位置:首页 > 其它

关于gcc编译产生可调试文件的打印变量问题

2015-10-16 21:58 344 查看
最近写了一个小程序,内部变量的改变自己不是很清楚,所以想使用gdb调试器来查看变量的改变过程,进而对其有一个更好地把握。

但是在gcc编译加上-g选项后,进入gdb调试,却怎么也打印不出来变量的值,最初是出现No symbol "xxx" in current context

后来经过查资料后,了解到这个可能是由于gcc编译的时候优化造成的,对局部变量进行寄存器存值运算,以及变量是否涉及到公共子表达式的问题

后来,我在编译的时候加上了-O0 这个选项(前面是大O,后面是零),然后再进行测试,可是结果还是No symbol "xxx" in current context

再后来,我在网上了解到了-gstabs+这个选项,而对于这个选项,解释是:以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.

对于stabs格式,我又进行了一番调查,发现,他是一个做调试信息的东西,调试信息包含了源文件的行号,类型变量,函数,以及他们的

参数,作用域等。而这些东西是被放在.stab后面的,这些调试信息分布在生成代码的各处,最后,汇编器将这些目标文件中的符号表和

字符串表映射到调试信息中。这样生成的调试文件,就要使用-gstabs+这个选项。

在我将此选项加在gcc后,这下,得到了不同的结果,但是,却和我想要的结果大相近庭,结果是一个和实际不符合的数,一看就是一个随机数 ,可是这个数字明显是已经初始化的值。

最后,另一个选项-gdwarf-2
这个选项吸引了我,这个选项的解释是:产生DWARF version2 的格式的调试信息,常用于IRIXX6上的DBX调试器.GCC会使用DWARF version3的一些特性.

可以指定调试信息的等级:在指定的调试格式后面加上等级:

如: -ggdb2 等,0代表不产生调试信息.在使用-gdwarf-2时因为最早的格式为-gdwarf2会造成混乱,所以要额外使用一个-glevel来指定调试信息的 等级,其他格式选项也可以另外指定等级.
-gdwarf这个选项,后面的等级如果为1
的话是不支持的,为2 可以达到效果,经尝试,为3亦可以达到效果。
当加上这个选项后,结果明显正确了,原来是调试格式信息的不同还有等级的不同会影响到最后调试的过程,gcc这个编译器有很多的选项,对于调试信息的输出也有很多中格式,以后还要多多了解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: