矮人错误:编译单元标题中的版本错误(为4,应为2)

时间:2012-07-26 14:02:27

标签: gdb dwarf

共享对象是在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]

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

是什么导致了这个问题?

3 个答案:

答案 0 :(得分:14)

实际上,无法调试的模块主要是从源代码构建的,除了一个由第三方提供的“外部”对象文件someextcode.o之外。

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

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

答案 1 :(得分:14)

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

解决方案:更新gdb或使用其他调试格式编译文件(DWARF2适用于gdb 6)。

我最近在freeBSDnasmnasm使用DWARF3编译二进制文件以及gdb附带的freeBSD 9.1时遇到此问题不接受它。

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

Debug options for GCC

答案 2 :(得分:0)

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