セグメンテーション違反の行番号を表示するように設定できる gcc オプションはありますか?
自分ができるということがわかっている:
- 行ごとにデバッグする
- コードにprintfsを入れて絞り込みます。
編集:
bt
/where
gdbでスタックなし。- 役立つ提案
セグメンテーション違反の行番号を表示するように設定できる gcc オプションはありますか?
自分ができるということがわかっている:
編集:
bt
/ where
gdbでスタックなし。gcc オプションについてはわかりませんが、gdb を使用してアプリケーションを実行し、アプリケーションがクラッシュwhere
したときに、終了時にスタックを確認するように入力してください。
$ gdb blah
(gdb) run
(gdb) where
完全を期すために編集します。
また、gcc オプションを使用してデバッグ フラグを指定してアプリケーションをビルド-g
し、実行可能ファイルに行番号を含めるようにしてください。
もう 1 つのオプションは、bt
(backtrace) コマンドを使用することです。
プログラムが SEGV シグナルを受け取ると、gcc にスタックトレースを出力させることができます。これは、Java やその他の親しみやすい言語が null ポインター例外を処理する方法と同様です。詳細については、こちらの回答を参照してください。
これの良いところは、コードにそのまま残すことができることです。素敵なデバッグ出力を得るために gdb を介して実行する必要はありません。
-g を指定してコンパイルし、そこにある指示に従うと、addr2lineなどのコマンドライン ツールを使用して、出力からファイル/行情報を取得できます。
valgrind で実行します。
デバッグ(-g)を使用してコンパイルし、デバッガー(gdb、run、bt)で実行するための前述のすべての提案が機能しない場合は、次のようにします。
core
場合は、同じ状態で開始し、特定のプロセスやメモリイメージに接続されません。-fstack-protector-all
ます。パッチを適用してGCC3.xに追加できます。-g でデバッグフラグを付けてビルドする必要もあります
gdb を使用してコア ダンプを開くこともできます (ただし、-g が必要です)。
No stack
プログラムが正常に終了すると、問題が発生するようです。
記録のために、私は自分のコードで戻り値を忘れていたため、この問題が発生しました。これにより、プログラムは失敗コードで終了しました。
GCC がこの情報を提供する方法はありません。GDB などの外部プログラムに依存する必要があります。
GDB は、プログラムが seg faulted になった後、「bt」(「backtrace」の略) コマンドでクラッシュが発生した行を表示できます。これにより、クラッシュの行だけでなく、プログラムのスタック全体が得られます (したがって、クラッシュが発生した関数の呼び出し元を確認できます)。