2016-04-18 3 views
0

次のようにgdbコマンドを使用してセグメンテーションフォールトをローカライズしますが、私は混乱している。どういう意味ですか?それを避ける方法は?gdbプログラムコア:特定のバグを取得しない

$ gdb program core 
... 
Program terminated with signal SIGSEGV, Segmentation fault. 
#0 0x0000048d0000048c in ??() 
(gdb) bt 
#0 0x0000046a00000469 in ??() 
#1 0x0000046c0000046b in ??() 
#2 0x0000046e0000046d in ??() 
#3 0x000004700000046f in ??() 
#4 0x0000047300000472 in ??() 
#5 0x0000047600000475 in ??() 
#6 0x0000047800000477 in ??() 
#7 0x0000047a00000479 in ??() 
#8 0x0000047d0000047b in ??() 
... 

私は配列が範囲外であることを発見しました。しかし、私はまだ上記の現象と混同しています。これはあなたのプログラムが与えられた順序で、 は、これら2つのオプションを試してみてください(機能シンボルテーブルによって提供されていない)のgdbで関数unknowに墜落したということを意味

+0

'bt'と入力してバックトレースを取得します。 '??' sしか表示されない場合、バイナリにはシンボルテーブルがありません。-gでコンパイルされませんでした。 – kfsone

+0

-gでコンパイルしてもまだ表示されていますか?同じ偶数型です。 – luohao

+0

@luohao私は自分の答えを更新しました。 –

答えて

1

0x0000048d0000048c

あなたが関数ポインタを通じて関数を呼び出しましたが、そのポインタは二つの整数で上書きされているようにこれは、なります(これらの値はそのプログラムの何かのように見えるん0x48d == 11650x48c == 1164使っています?)。

あなたはどのようにそこに到着したかを伝えるためにbtを使用する必要があります。

ValgrindまたはAddress Sanitizerを使用して、初期化されていないメモリやバッファのオーバーフロー(無効な関数ポインタで終わる一般的な方法)をチェックすることをお勧めします。

更新:

は今、あなたはスタックトレースを示していること、それは1129年、1130年、1131年のような値でそれを埋める(あなたが溢れてきたあなたが整数のいくつかのローカル配列を持っているほぼ100%保証ですなど)、スタックを破壊します。

住所Sanitizer(最近のバージョンのGCCで利用可能)は、バグがどこにあるかを直接指摘してください。

0

  1. あなたがターゲットをデバッグしている場合は、可能gccを使用している場合は、すべてのコードレイヤーがオプション-gでコンパイルされていることを確認してください。
  2. file "binary_with_symbol_table"というコマンドでgdbにシンボルテーブルを手動で与えることができます。これにより、バグの機能とアドレスがわかります。

セグメント例外の後ろには多くの例外が隠されている可能性があることに注意してください。

+0

私は-gでコンパイルしました。バイナリをロードするためにgdbに 'file program'と入力しましたが、まだ表示されていますか? – luohao

関連する問題