【问题标题】:Dwarf Error: wrong version in compilation unit header (is 4, should be 2)矮人错误:编译单元标头中的版本错误(是 4,应该是 2)
【发布时间】:2012-07-26 14:02:27
【问题描述】:

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

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

是什么导致了这个问题?

【问题讨论】:

    标签: gdb dwarf


    【解决方案1】:

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

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

    我最近遇到了freeBSDnasm 的问题,nasmDWARF3 编译二进制文件,而freeBSD 9.1 附带的gdb 不接受它。

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

    Debug options for GCC

    【讨论】:

    • 有些软件自带了修改版的gdb,你把它加入PATH环境后,你的系统默认gdb是隐藏的。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-20
        • 1970-01-01
        • 2019-07-10
        • 1970-01-01
        • 1970-01-01
        • 2015-07-06
        • 2015-06-14
        相关资源
        最近更新 更多