20

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 です。

set complaints 10000GDB でファイルをロードすると、次のようなメッセージが出力されます。

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が「間違った」バージョンであることを意味しますか?

4

3 に答える 3

27

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

于 2013-10-07T22:36:46.960 に答える
15

Chris Dodd の回答に加えてgcc -gdwarf-3、dwarf3 デバッグ情報でコンパイルする でコードをコンパイルすることもできます。GDBバージョンと互換性があります。

于 2014-09-09T21:31:04.897 に答える
2

gdb は、.symtab .dynsym の前に .debug_info セクションを読み取ります。

nm .symtab .dynsym を読むだけです。

これは、ELF ファイルの .debug_info セクションがストライプ化されたためです。

以下を使用できます。

readelf -S youelf | grep -i debug

debug_info が存在するかどうかを確認します。

于 2014-09-04T03:08:49.837 に答える