2011-09-29 8 views
5

コアダンプの原因となるシグナルを受け取ったとき、siginfo_tおよびucontext_t構造体をグローバル変数にコピーするために自分のハンドラを実行してコアダンプでアクセスできるようにしたいと思います。現在のところ、ハンドラの最後では、デフォルトのハンドラを再割り当てし、raise(thesig)を呼び出します。これを行う際の問題は、コアダンプの "info registers"が、ハンドラ内のレジスタの状態を示し、元の信号の時ではないことを示します。私はucontext_tを保存して以来、元のレジスタ値を見ることができますが、その知識はチームの周りにコアダンプが渡されたときに失われたり忘れられたりする可能性があります。Linux:後続のコアダンプのためのレジスタを捨てることなくスヌープ信号を送る?

私の質問は、シグナルをリレイズして、コアダンプファイルが元のシグナルのレジスタ状態を保持していることを確認する方法ですか?私はおそらくハンドラの最後にあるすべてのregを手動で復元し、raise()を呼び出す代わりにシグナルを引き起こした命令に戻るためにインラインasmを使うことができると思っていましたが、命令を試行すると、最初の試行と同じシグナリング動作が発生します。

答えて

3

はあなたのハンドラで信号を再提起した場合、彼らはコアダンプ

にアクセスすることができるように、その後、コピーする必要はありません、グローバル変数へのsiginfo_tとucontext_t構造をコピーします何か - 値はスタック上にあり、コアダンプでアクセス可能です。

"info registers"は、ハンドラ内のレジスタの状態を示し、元の信号の時ではありません。

もう一度up 5(またはしかしあなたが墜落地点に到達するためにステップアップする必要がある多くのレベル)とinfo regを行います。

信号をリレイズして、コアダンプファイルが元の信号のレジスタ状態を保持していることを確認する方法はありますか?

はい:信号処理をSIG_DFLに設定してsignal(signum, SIG_DFL);を使用し、ハンドラから戻します。 SIGSEGVの原因となった命令が再起動され、即座にコアダンプが発生します。

+0

@ER、コアダンプは常に間違った場所を指します。 :( – sree

関連する問題