使用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。
我使用的gdb版本是7.2,所需要的dwarf版本是2。因此gcc和gdb版本不匹配。
有两种方法解决该问题:升级gdb
gcc编译时,使用-gdwarf-2选项,限定生成的dwarf为版本2
使用-gdwarf-2选项编程生成程序,使用readelf查看debug信息,从输出可以看出,dwarf版本是2。
通过以上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调试信息格式。