1. ホーム
  2. c

[解決済み] GDBは「シンボルテーブルがない」と言うが、nmはファイルがデバッグシンボルを持っていると表示する

2022-03-01 12:21:40

質問

GDBを使用して簡単なCプロジェクトをデバッグしようとしていますが、GDBはどのようにコンパイルしてもプログラムのデバッグ・シンボルを見つけることができないようです。

プログラムをGDBにロードすると、以下のように表示されるので、シンボルを正常に読み込んだと主張します。

Reading symbols from /home/edward/<executable>...done.

しかし、プログラムを実行し、セグメンテーションフォールトでブレークし、次のように入力します。 info locals と表示されます。

No symbol table info available.

また bt は、私が書いた関数(システムコールやライブラリコールではない)の内部で実行が停止したことを示していますが、行番号の情報はなく、生のメモリアドレスが表示されているだけです。

なぜGDBは、以前はうまく読み込めたシンボルを見つけたり使ったりできないのでしょうか?私は nmobjdump のようなセクションが表示されます。 .debug_info , .debug_line ということで、このファイルには実際にデバッグ用のシンボルが含まれています。

私は通常、以下のフラグを設定したMakefileでコンパイルしています。

CFLAGS = -mno-red-zone -fno-omit-frame-pointer -ggdb -O0 -I. -Wdeclaration-after-statement -Wall

で、make が gcc を呼び出す際に使用されていることがわかります。しかし、私はこれを -g を起動し、手動でコンパイルします。 gcc -g -O0 バイナリファイルにはデバッグシンボルが含まれており、GDBはそれを読み取りますが、GDBコマンドを実行すると、デバッグ情報が利用できないというメッセージが表示されます。

更新情報

Ubuntu 12.04を使用しています。GDBのバージョンは7.4、GCCのバージョンは4.8.1です。

もし私が set complaints 10000 をGDBで実行し、ファイルを読み込むと、次のような不満が表示されます。

Reading symbols from /home/edward/<snip>/minithread...
DW_AT_low_pc 0x400690 is not < DW_AT_high_pc 0x33 for DIE at 0x205 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x4006c3 is not < DW_AT_high_pc 0xa9 for DIE at 0x235 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x40076c is not < DW_AT_high_pc 0xad for DIE at 0x287 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400819 is not < DW_AT_high_pc 0xe7 for DIE at 0x2d3 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400900 is not < DW_AT_high_pc 0x4f for DIE at 0x345 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x40094f is not < DW_AT_high_pc 0x55 for DIE at 0x39d [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x4009a4 is not < DW_AT_high_pc 0x38 for DIE at 0x3e7 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x4009dc is not < DW_AT_high_pc 0x43 for DIE at 0x433 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400a20 is not < DW_AT_high_pc 0x2e for DIE at 0x56c [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400a4e is not < DW_AT_high_pc 0x2e for DIE at 0x5aa [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400a7c is not < DW_AT_high_pc 0x29 for DIE at 0x5d4 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400aa5 is not < DW_AT_high_pc 0x49 for DIE at 0x620 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400aee is not < DW_AT_high_pc 0xca for DIE at 0x66c [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400bb8 is not < DW_AT_high_pc 0x7bb for DIE at 0x6f0 [in module /home/edward/<snip>/minithread]...done.

これらのエラーは問題の原因なのでしょうか?私のGDBが間違ったバージョンであることを意味するのでしょうか?

解決方法を教えてください。

gcc 4.8.1は、gdb 7.4が理解できないdwarf4デバッグ情報を生成します。 gdb 7.6をインストールする必要があります。