セグメンテーションフォールトの行番号を提供するgccオプションを設定できますか?
自分ができるということがわかっている:
編集:
bt
/where
はスタックを与えません。Gccオプションはわかりませんが、gdbでアプリケーションを実行できます。クラッシュした場合は、where
と入力して、終了時にスタックを確認します。 。
$ gdb blah
(gdb) run
(gdb) where
完全を期して編集:
また、-g
gccオプションを使用して実行可能ファイルに行番号を含めると、デバッグフラグを使用してアプリケーションをビルドする必要があります。
別のオプションは、bt
(バックトレース)コマンドを使用することです。
完全なShell/gdbセッションは次のとおりです。
$ gcc -ggdb myproj.c $ gdb a.out gdb> run --some-option = foo --other-option = bar ( gdbは、プログラムがセグメンテーションフォールトにヒットしたと言います)まだ実行されています]? y $ emacs myproj.c#へー、今何がエラーなのか知っている...
ハッピーハッキング:-)
Javaおよびその他のより使いやすい言語がNULLポインター例外を処理する方法と同様に、プログラムがSEGVシグナルを受け取ったときにgccにスタックトレースを出力させることができます。詳細については、私の回答を参照してください。
これの良いところは、コードにそのまま残すことができることです。 Niceデバッグ出力を取得するためにgdbを介して実行する必要はありません。
-gを指定してコンパイルし、そこの指示に従うと、 addr2line などのコマンドラインツールを使用して、出力からファイル/行情報を取得できます。
Valgrindの下で実行します。
また、-gのデバッグフラグを使用してビルドする必要があります
Gdbでコアダンプを開くこともできます(ただし、-gが必要です)。
デバッグ(-g)でコンパイルし、デバッガー(gdb、run、bt)で実行するための前述の提案がすべて機能しない場合、次のようにします。
core
)を追加することを忘れないでください。 。-fstack-protector-all
。パッチを使用してGCC 3.xに追加できます。No stack
問題は、プログラムが正常に終了したときに発生するようです。
記録のために、コードでの戻りを忘れていたため、この問題が発生し、プログラムが失敗コードで終了しました。
GCCがこの情報を提供する方法はありません。GDBなどの外部プログラムに依存する必要があります。
GDBは、プログラムのセグメンテーションが失敗した後に、「bt」(「backtrace」の略)コマンドでクラッシュが発生した行を提供できます。これにより、クラッシュの行だけでなく、プログラムのスタック全体が表示されます(したがって、クラッシュが発生した関数を呼び出したものを確認できます)。