GDBを使用して単純なCプロジェクトをデバッグしようとしていますが、どのようにコンパイルしても、GDBがプログラムのデバッグシンボルを見つけられないようです。
プログラムをGDBにロードすると、印刷されるため、シンボルを正常に読み取ったと表示されます
Reading symbols from /home/edward/<executable>...done.
しかし、プログラムを実行し、セグメンテーション違反で中断し、info locals
と入力すると、
No symbol table info available.
また、bt
は、私が記述した関数(システムコールやライブラリコールではない)内で実行が停止したことを示していますが、行番号情報はなく、生のメモリアドレスのみです。
GDBが以前に正常に読み取ったシンボルを検出または使用できないのはなぜですか?実行しているバイナリファイルでnm
とobjdump
を実行しましたが、どちらも.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です。
GDBでset complaints 10000
を実行してからファイルをロードすると、次の問題が出力されます。
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をインストールする必要があります
Chris Doddの回答に加えて、dwarf3デバッグ情報でコンパイルするgcc -gdwarf-3
でコードをコンパイルすることもできます。 GDBのバージョンと互換性があります。
gdbは、.symtab .dynsymの前に.debug_infoセクションを読み取りました。
nmは.symtab .dynsymを読み取るだけです。
これは、ELFファイルの.debug_infoセクションがストライプ化されているためです。
以下を使用できます。
readelf -S youelf | grep -i debug
debug_infoが存在するかどうかを確認します。