小人错误:编译单元头中的版本错误(应为2,实际为4)

28

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

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

这个问题是什么原因造成的?

3个回答

18
问题在于您的版本的gdb不支持其中一个二进制文件使用的DWARF版本。
解决方案:更新gdb或使用另一种调试格式编译您的文件(DWARF2适用于gdb 6)。
我最近在freeBSDnasm上遇到了这个问题,nasm使用DWARF3编译二进制文件,而随freeBSD 9.1一起提供的gdb不接受它。
希望这个答案能帮助任何遇到类似问题的人:P GCC的调试选项

有些软件会携带它修改过的 gdb 版本,当你将其添加到 PATH 环境变量中后,系统默认的 gdb 就会被隐藏。 - hailinzeng

17

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

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

不幸的是,似乎单个模块的问题可能会破坏整个共享对象(.so)的调试功能,而不清楚问题的根本原因。


2

我之前使用的gdb版本是7.0,导致无法调试应用程序。后来选择了gdb 7.10版本,问题得以解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接