共享对象是在RedHat Linux上构建的,虽然所有代码都是使用debug编译的,但调试器(gdb)拒绝加载符号并发出错误,如下所示:
...
GNU gdb Fedora (6.8-37.el5)
...
This GDB was configured as "x86_64-redhat-linux-gnu"...
Dwarf Error: wrong version in compilation unit header (is 4, should be 2) [in module libgrokf.so]
有了这个错误,我无法在任何函数中触发断点,也看不到正确的堆栈跟踪。我重新编译了整个项目,但没有任何帮助。我知道在过去的某个时候调试该模块没有问题。
是什么导致了这个问题?
答案 0 :(得分:14)
实际上,无法调试的模块主要是从源代码构建的,除了一个由第三方提供的“外部”对象文件someextcode.o之外。
在调查问题时,发现someextcode.c是使用-g3标志编译的,显然,它将DWARF版本4放在编译单元头中。将其更改为-g解决了问题。
不幸的是,单个模块出现问题可能会破坏整个共享对象(.so)的调试能力,而不会明确指出问题的根源。
答案 1 :(得分:14)
问题是您的gdb
版本不支持您的某个二进制文件中使用的DWARF
版本。
解决方案:更新gdb
或使用其他调试格式编译文件(DWARF2
适用于gdb
6)。
我最近在freeBSD
和nasm
,nasm
使用DWARF3
编译二进制文件以及gdb
附带的freeBSD 9.1
时遇到此问题不接受它。
我希望这个答案可以帮助任何有类似问题的人:P
答案 2 :(得分:0)
通过选择正确的gdb版本进行调试,我的问题得到了解决。之前我使用的是gdb 7.0 ...当我开始使用gdb版本7.10时,我能够调试我的应用程序。