在 RedHat Linux 上构建了一个共享对象,虽然所有代码都是通过调试进行编译的,但调试器 (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]
出现此错误时,我无法在任何函数中触发断点,也无法看到正确的堆栈跟踪。我重新编译了整个项目,但没有任何帮助。我确实知道过去一段时间调试该模块没有问题。
是什么原因导致这个问题?
碰巧,无法调试的模块大部分是从源代码构建的,除了第三方提供的一个小“外部”目标文件 someextcode.o 。
在调查该问题时,发现 someextcode.c 是使用 -g3 标志编译的,显然,该标志将 DWARF 版本 4 放在编译单元标头中。将其更改为 -g 解决了问题。
不幸的是,单个模块的问题似乎可能会破坏整个共享对象(.so)的调试能力,而不会明确指出问题的根源。
问题是您的
gdb
版本不支持您的二进制文件之一中使用的 DWARF
版本。
解决方案:更新
gdb
或使用其他调试格式编译文件(DWARF2
适用于 gdb
6)。
我最近遇到了
freeBSD
和 nasm
的问题,nasm
使用 DWARF3
编译二进制文件,而 gdb
附带的 freeBSD 9.1
不接受它。
我希望这个答案可以帮助任何有类似问题的人:P
通过选择正确的 gdb 版本进行调试,我的问题得到了解决。早些时候我使用的是 gdb 7.0...当我开始使用 gdb 版本 7.10 时,我能够调试我的应用程序。
我也有同样的错误。 在 OpenBSD 上,存储库中的 GDB 版本是 6.3,但当前版本是 14.2。 由于许可证冲突,它已经多年没有更新,因此不应使用。可能不应该在存储库中。
解决方案是从源代码、端口编译 GDB,或使用 lldb 调试器。 它适用于使用 clang 和 gcc 编译的程序。