使用gdb调试程序,当我们需要查看一个变量值,使用p 变量,会提示 no symbol xxx in current context。
查阅资料,得知,需要再编译的时候,加上-g选项,并且不能加-On选项,即关闭优化。但是即使使用-g选项并且关闭优化,编译程序,使用gdb调试,依然会出现上述问题。这说明了,不是-g选项和优化的问题。
通过查阅资料,以及实验。终于解决了该问题。出现该问题的原因,在于gcc版本与gdb版本不匹配。
gdb可以调试程序的原理,在于gcc编译的时候,会生成调试信息。gdb利用这些调试信息,去调试程序。
而调试信息,是有格式的。目前世界上,通用的两种调试信息格式是 DWARF 和 STAB。可以查看如下网站,了解这两种格式:
https://www.ibm.com/developerworks/library/os-debugging/os-debugging-pdf.pdf
对于 DWARF,也是有很多版本的,比如version2, version3等。可以查看wiki了解更多:
https://en.wikipedia.org/wiki/DWARF
我使用的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的官网可以看出来:
https://gcc.gnu.org/gcc-4.8/changes.html·
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版本以及之后的版本,才是默认使用DWARF4调试信息格式。