web-dev-qa-db-ja.com

ドワーフエラー:コンパイルユニットヘッダーのバージョンが間違っています(4である必要があります2)

共有オブジェクトが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]

このエラーにより、どの関数でもトリガーするブレークポイントを取得できず、適切なスタックトレースを確認できませんでした。プロジェクト全体を再コンパイルしましたが、何の助けにもなりませんでした。私は以前、そのモジュールのデバッグに問題がなかったことを知っています。

この問題の原因は何ですか?

22
Dror Harari

問題は、バージョンのgdbが、バイナリの1つで使用されているDWARFバージョンをサポートしていないことです。

解決策:gdbを更新するか、別のデバッグ形式を使用してファイルをコンパイルします(DWARF2gdb 6で動作します)。

最近、freeBSDnasmでこの問題が発生しました。nasmDWARF3を使用してバイナリをコンパイルすると、freeBSD 9.1に同梱されているgdbで受け入れられません。

この回答が同様の問題を抱えている人に役立つことを願っています:P

GCCのデバッグオプション

14
Marco

たまたま、デバッグできなかったモジュールは、サードパーティから提供された1つの小さな「外部」オブジェクトファイルsomeextcode.oを除いて、ほとんどがソースからビルドされました。

この問題を調査したところ、someextcode.cが-g3フラグでコンパイルされていることがわかりました。これにより、DWARFバージョン4がコンパイルユニットヘッダーに配置されているようです。これを-gに変更すると、問題が解決しました。

残念ながら、単一のモジュールに問題があると、問題の根本原因を明確に示すことなく、共有オブジェクト(.so)全体のデバッグ機能が損なわれる可能性があります。

14
Dror Harari

私の問題は、デバッグに適切なgdbバージョンを選択することで解決しました。以前はgdb 7.0を使用していました... gdbバージョン7.10を使い始めたとき、アプリケーションをデバッグすることができました。

0
Kapil Satija