共有オブジェクトが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
が、バイナリの1つで使用されているDWARF
バージョンをサポートしていないことです。
解決策:gdb
を更新するか、別のデバッグ形式を使用してファイルをコンパイルします(DWARF2
はgdb
6で動作します)。
最近、freeBSD
とnasm
でこの問題が発生しました。nasm
でDWARF3
を使用してバイナリをコンパイルすると、freeBSD 9.1
に同梱されているgdb
で受け入れられません。
この回答が同様の問題を抱えている人に役立つことを願っています:P
たまたま、デバッグできなかったモジュールは、サードパーティから提供された1つの小さな「外部」オブジェクトファイルsomeextcode.oを除いて、ほとんどがソースからビルドされました。
この問題を調査したところ、someextcode.cが-g3フラグでコンパイルされていることがわかりました。これにより、DWARFバージョン4がコンパイルユニットヘッダーに配置されているようです。これを-gに変更すると、問題が解決しました。
残念ながら、単一のモジュールに問題があると、問題の根本原因を明確に示すことなく、共有オブジェクト(.so)全体のデバッグ機能が損なわれる可能性があります。
私の問題は、デバッグに適切なgdbバージョンを選択することで解決しました。以前はgdb 7.0を使用していました... gdbバージョン7.10を使い始めたとき、アプリケーションをデバッグすることができました。