[解決済み] GDBは「シンボルテーブルがない」と言うが、nmはファイルがデバッグシンボルを持っていると表示する
質問
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 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をインストールする必要があります。
関連
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み】デバッガgdbの使用時に不明な終了シグナルが発生する。
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み] struct has no member named
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】fgetsによるセグメンテーションフォールト(コアダンプ) - と思う。
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み】シンプルなC言語のscanfが機能しない?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み】組み込み関数「malloc」の暗黙の宣言の非互換性
-
[解決済み】 error: too few arguments to function `printDay' (C言語)
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み] テスト
-
[解決済み】警告:式の結果が未使用の場合
-
[解決済み】シンプルなC言語のscanfが機能しない?重複