dwarf2 gdb_gdb no symbol in current context研究

当使用gdb调试程序遇到nosymbol错误时,通常认为是-g选项和优化设置问题,但实际情况可能由gcc和gdb版本不匹配引起。DWARF调试信息格式的版本差异导致调试失败。解决方法包括升级gdb或在编译时指定-gdwarf-2选项。确保gcc和gdb版本兼容或调试信息格式匹配,即可正常查看变量值。
摘要由CSDN通过智能技术生成

使用gdb调试程序,当我们需要查看一个变量值,使用p 变量,会提示 no symbol xxx in current context。

查阅资料,得知,需要再编译的时候,加上-g选项,并且不能加-On选项,即关闭优化。但是即使使用-g选项并且关闭优化,编译程序,使用gdb调试,依然会出现上述问题。这说明了,不是-g选项和优化的问题。

通过查阅资料,以及实验。终于解决了该问题。出现该问题的原因,在于gcc版本与gdb版本不匹配。

gdb可以调试程序的原理,在于gcc编译的时候,会生成调试信息。gdb利用这些调试信息,去调试程序。

而调试信息,是有格式的。目前世界上,通用的两种调试信息格式是 DWARF 和 STAB。可以查看如下网站,了解这两种格式:

对于 DWARF,也是有很多版本的,比如version2, version3等。可以查看wiki了解更多:

我使用的gcc版本是6.1.0,使用-g选项编译出的调试信息,是dwarf4版本,可以使用如下命令,查看 dwarf 版本:

readelf --debug-dump=info elf文件 | grep -A 2 'Compilation Unit @'

以下是打印信息,从打印信息,可以看出,所生成的dwarf版本是4。

30ac9f1829803411aa81eb4795436a30.png

我使用的gdb版本是7.2,所需要的dwarf版本是2。因此gcc和gdb版本不匹配。

有两种方法解决该问题:升级gdb

gcc编译时,使用-gdwarf-2选项,限定生成的dwarf为版本2

使用-gdwarf-2选项编程生成程序,使用readelf查看debug信息,从输出可以看出,dwarf版本是2。

4ad6a241c1186a6d6d441bb2d30863b2.png

通过以上2种方式,就可以解决该问题。此时用gdb调试程序,就可以查看变量了。

gcc从4.8版本之后,默认生成DWARF4,使用 gdwarf-4 -fno-debug-types-section选项, 可以从gcc的官网可以看出来:

DWARF4 is now the default when generating DWARF debug information. When -g is used on a platform that uses DWARF debugging information, GCC will now default to -gdwarf-4 -fno-debug-types-section.

GDB 7.5, Valgrind 3.8.0 and elfutils 0.154 debug information consumers support DWARF4 by default. Before GCC 4.8 the default version used was DWARF2. To make GCC 4.8 generate an older DWARF version use -g together with -gdwarf-2 or -gdwarf-3. The default for Darwin and VxWorks is still -gdwarf-2 -gstrict-dwarf.

而GDB 7.5版本以及之后的版本,才是默认使用DWARF4调试信息格式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值