26

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

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

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

4

3 に答える 3

16

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

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

私は最近、freeBSDnasmでこの問題をnasm抱えDWARF3ていました。gdbfreeBSD 9.1

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

GCC のデバッグ オプション

于 2013-09-16T23:12:29.633 に答える
15

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

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

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

于 2012-07-26T14:02:27.030 に答える
1

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

于 2016-02-16T11:22:06.177 に答える