web-dev-qa-db-ja.com

セグメンテーション障害の行番号

セグメンテーションフォールトの行番号を提供するgccオプションを設定できますか?

自分ができるということがわかっている:

  1. 行ごとにデバッグする
  2. コードにprintfsを入れて絞り込みます。

編集:

  1. gdbのbt/whereはスタックを与えません。
  2. 役に立つ提案
47
Rohit

Gccオプションはわかりませんが、gdbでアプリケーションを実行できます。クラッシュした場合は、whereと入力して、終了時にスタックを確認します。 。

$ gdb blah
(gdb) run
(gdb) where

完全を期して編集:

また、-g gccオプションを使用して実行可能ファイルに行番号を含めると、デバッグフラグを使用してアプリケーションをビルドする必要があります。

別のオプションは、bt(バックトレース)コマンドを使用することです。

63
rck

完全なShell/gdbセッションは次のとおりです。

 $ gcc -ggdb myproj.c 
 $ gdb a.out 
 gdb> run --some-option = foo --other-option = bar 
( gdbは、プログラムがセグメンテーションフォールトにヒットしたと言います)まだ実行されています]? y 
 $ emacs myproj.c#へー、今何がエラーなのか知っている... 

ハッピーハッキング:-)

21
Jonas Kölker

Javaおよびその他のより使いやすい言語がNULLポインター例外を処理する方法と同様に、プログラムがSEGVシグナルを受け取ったときにgccにスタックトレースを出力させることができます。詳細については、私の回答を参照してください。

これの良いところは、コードにそのまま残すことができることです。 Niceデバッグ出力を取得するためにgdbを介して実行する必要はありません。

-gを指定してコンパイルし、そこの指示に従うと、 addr2line などのコマンドラインツールを使用して、出力からファイル/行情報を取得できます。

10
Todd Gamblin

Valgrindの下で実行します。

7
anonnn

また、-gのデバッグフラグを使用してビルドする必要があります

Gdbでコアダンプを開くこともできます(ただし、-gが必要です)。

4
cbrulak

デバッグ(-g)でコンパイルし、デバッガー(gdb、run、bt)で実行するための前述の提案がすべて機能しない場合、次のようにします。

  • 初級:たぶん、あなたはデバッガーの下で走っていないのかもしれません。ただ、死後のコアダンプを分析しようとしているだけです。 (デバッグセッションを開始してもプログラムを実行しない場合、または終了する場合、バックトレースを要求すると、gdbは「スタックなし」と表示します。実行中のプログラムがまったくないためです。忘れないでください「実行」と入力します。)セグメンテーション違反が発生した場合、gdbの実行時に3番目の引数(core)を追加することを忘れないでください。 。
  • 難しい:プログラムが実際に実行されている/実行されていても、gdbが「スタックなし」と言っている場合、スタックポインターがひどく破壊されている可能性があります。その場合、どこかでバッファオーバーフローの問題が発生する可能性があり、ランタイム状態を完全に破壊するほど深刻です。 GCC 4.1は、ProPolice「Stack Smashing Protector」をサポートします。これは、-fstack-protector-all。パッチを使用してGCC 3.xに追加できます。
4
Liudvikas Bukys

No stack問題は、プログラムが正常に終了したときに発生するようです。

記録のために、コードでの戻りを忘れていたため、この問題が発生し、プログラムが失敗コードで終了しました。

1
kiwixz

GCCがこの情報を提供する方法はありません。GDBなどの外部プログラムに依存する必要があります。

GDBは、プログラムのセグメンテーションが失敗した後に、「bt」(「backtrace」の略)コマンドでクラッシュが発生した行を提供できます。これにより、クラッシュの行だけでなく、プログラムのスタック全体が表示されます(したがって、クラッシュが発生した関数を呼び出したものを確認できます)。

1
SoapBox