54

セグメンテーション違反の行番号を表示するように設定できる gcc オプションはありますか?

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

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

編集:

  1. bt/ wheregdbでスタックなし。
  2. 役立つ提案
4

8 に答える 8

76

gcc オプションについてはわかりませんが、gdb を使用してアプリケーションを実行し、アプリケーションがクラッシュwhereしたときに、終了時にスタックを確認するように入力してください。

$ gdb blah
(gdb) run
(gdb) where

完全を期すために編集します。

また、gcc オプションを使用してデバッグ フラグを指定してアプリケーションをビルド-gし、実行可能ファイルに行番号を含めるようにしてください。

もう 1 つのオプションは、bt(backtrace) コマンドを使用することです。

于 2009-02-02T23:46:35.007 に答える
11

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

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

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

于 2009-02-03T00:21:55.980 に答える
7

valgrind で実行します。

于 2010-10-04T17:37:03.717 に答える
4

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

  • 初級:デバッガーで実行していない可能性があります。死後のコアダンプを分析しようとしているだけです。(デバッグセッションを開始したが、プログラムを実行しない場合、またはプログラムが終了した場合、バックトレースを要求すると、実行中のプログラムがまったくないため、gdbは「スタックなし」と表示します。忘れないでください。 「run」と入力します。)segfaultedの場合は、gdbを実行するときに3番目の引数()を追加することを忘れないでください。追加しないcore場合は、同じ状態で開始し、特定のプロセスやメモリイメージに接続されません。
  • 難しい:プログラムが実際に実行されている/実行されていたが、gdbが「スタックなし」と表示している場合は、スタックポインタがひどく破壊されている可能性があります。その場合、どこかでバッファオーバーフローの問題が発生している可能性があり、ランタイム状態を完全にマッシュアップするのに十分なほど深刻です。GCC 4.1は、で有効になっているProPoliceの「スタックスマッシングプロテクター」をサポートしてい-fstack-protector-allます。パッチを適用してGCC3.xに追加できます。
于 2009-02-03T01:55:43.280 に答える
4

-g でデバッグフラグを付けてビルドする必要もあります

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

于 2009-02-02T23:49:14.797 に答える
1

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

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

于 2015-09-18T11:34:43.300 に答える
1

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

GDB は、プログラムが seg faulted になった後、「bt」(「backtrace」の略) コマンドでクラッシュが発生した行を表示できます。これにより、クラッシュの行だけでなく、プログラムのスタック全体が得られます (したがって、クラッシュが発生した関数の呼び出し元を確認できます)。

于 2009-02-02T23:50:33.640 に答える