2011-10-19 12 views
4

C++プログラムがFreeBSD 6.2でクラッシュし、OSがコアダンプを作成するのに十分親切でした。いくつかのスタックフレームを切断し、命令ポインタをリセットし、gdbのプロセスを再起動することは可能ですか?クラッシュからコアダンプで復旧する

答えて

2

はい、gdbは実行中のプログラムだけでなくコアダンプもデバッグできます。 (

gdb a.out a.core 

そして、あなたはどのような方法で実行を継続することはできませんを除いて、あなたは、通常のようにデバッグすることができます:a.outはあなたのプログラムの実行可能ファイルの名前で、a.coreは、あなたのコアファイルの名前なので、同じようにgdbを呼び出すことと仮定すると、たとえできても、プログラムはちょうど再びクラッシュするでしょう)。スタックトレース、レジスタ、メモリなどを調べることができます。

+1

GDBは "プログラムを実行するだけでなく"コアダンプをデバッグしません。http://yosefk.com/blog/を参照してください。非常に面白い-gdb-ve-ery-funny.html – ACyclic

3

いくつかのスタックフレームを切断し、命令ポインタをリセットしてgdbでプロセスを再起動できますか?

私は、プロセスの状態を変更し、再度実行を開始するように設定しています(あたかも最初の場所でクラッシュしないかのように)。

いいえ、GDB(魔法のようにこの能力を持っていれば)があなたのファイルディスクリプタ(プロセスが亡くなったときに自動的に閉じたもの)をどのように処理するのですか?

+0

GDBが関数を呼び出して変数を割り当てる能力があると誤解されていないならば、少なくとも理論的にはプロセスが再開する時点でファイル記述子を復活させることは可能です。 – Droopov

+0

"機能を呼び出す能力を持っている" - あなたが "生きている"劣ったプロセスを持っている場合のみコアをデバッグするとき、GDBは "ファイル記述子を復活させる"ことはできません。また、ファイルオフセットはカーネルによってのみ維持されるので、GDBはそれらを復元する方法がありません。 –

0

本の可能性のある重複:Best practices for recovering from a segmentation fault

概要:それは可能ですが、お勧めできません。それを行う方法は、シグナルハンドラからsetjmp()とlongjmp()を使用することです。 (完全なソースコードの例を重複したポストで見てください。

関連する問題