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

Dro*_*ari 22 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]
Run Code Online (Sandbox Code Playgroud)

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

是什么导致了这个问题?

Dro*_*ari 14

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

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

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


Mar*_*rco 14

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

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

最近我有这个问题,freeBSD并且nasm,nasm编译与二进制DWARF3gdb附带freeBSD 9.1不接受它.

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

GCC的调试选项