矮人错误:编译单元头中的版本错误(是4,应该是2)

问题描述 投票:0回答:4

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

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

是什么原因导致这个问题?

gdb dwarf
4个回答
18
投票

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

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

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


18
投票

问题是您的

gdb
版本不支持您的二进制文件之一中使用的
DWARF
版本。

解决方案:更新

gdb
或使用其他调试格式编译文件(
DWARF2
适用于
gdb
6)。

我最近遇到了

freeBSD
nasm
的问题,
nasm
使用
DWARF3
编译二进制文件,而
gdb
附带的
freeBSD 9.1
不接受它。

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

GCC 调试选项


2
投票

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


0
投票

我也有同样的错误。 在 OpenBSD 上,存储库中的 GDB 版本是 6.3,但当前版本是 14.2。 由于许可证冲突,它已经多年没有更新,因此不应使用。可能不应该在存储库中。

解决方案是从源代码、端口编译 GDB,或使用 lldb 调试器。 它适用于使用 clang 和 gcc 编译的程序。

© www.soinside.com 2019 - 2024. All rights reserved.