26

在 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]

有了这个错误,我无法在任何函数中触发断点,也无法看到正确的堆栈跟踪。我重新编译了整个项目,但没有任何帮助。我确实知道过去一段时间调试该模块没有问题。

是什么导致了这个问题?

4

3 回答 3

16

问题是您的版本gdb不支持DWARF您的一个二进制文件中使用的版本。

gdb解决方案:使用另一种调试格式更新或编译您的文件(DWARF2适用于gdb6)。

我最近遇到了and的这个问题,用freeBSDand编译二进制文件不接受它。nasmnasmDWARF3gdbfreeBSD 9.1

我希望这个答案可以帮助任何有类似问题的人:P

GCC 的调试选项

于 2013-09-16T23:12:29.633 回答
15

碰巧的是,无法调试的模块主要是从源代码构建的,除了一个由第 3 方提供的小“外部”目标文件 someextcode.o。

在调查该问题时,发现 someextcode.c 是使用 -g3 标志编译的,显然,该标志将 DWARF 版本 4 放在编译单元标头中。将其更改为 -g 解决了问题。

不幸的是,单个模块的问题似乎会破坏整个共享对象 (.so) 的调试能力,而没有明确指出问题的根源。

于 2012-07-26T14:02:27.030 回答
1

通过选择正确的 gdb 版本进行调试,我的问题得到了解决。早些时候我使用的是 gdb 7.0...当我开始使用 gdb 7.10 版时,我能够调试我的应用程序。

于 2016-02-16T11:22:06.177 回答