2011-07-25 9 views
3

SIGSEGVのシグナルハンドラがあるにもかかわらず、セグメンテーションフォルトが発生しています。初めてデータが保護されたメモリに書き込まれると、シグナルハンドラが呼び出されていることがわかりますが、シグナルハンドラが終了する前に、セグメンテーションフォルトが表示されます。シグナルハンドラの存在下でのセグメンテーションフォルト

何が原因でしょうか?私のSIGSEGVハンドラがすべてのセグメンテーションフォールトを捕まえるはずですか?

+0

「SEGV」シグナルを処理することで何を達成したいですか? –

答えて

4

セグメンテーションフォールトがOSによって許可されていないメモリにアクセスするスタックポインタに関連している場合は、現在のスタックポインタを使用してプロセスを呼び出すことができません。シグナルハンドラへの呼び出しを含みます。つまり、シグナルハンドラ関数のコンパイラで作成されたプロローグは、スタック上にアクティベーションレコードを設定する必要があります。スタックポインタ自体が無効な場合、それは不可能です。これが起こる1つの方法は、現在実行中の関数のアクティベーションレコードを書き込むメモリ配列をオーバーフローさせることです。

あなたはsigaltstack()しかし、あなたのシグナルハンドラのスタックとして使用されるメモリの別の領域を定義し、次に信号用sigaction()SA_ONSTACKオプションを設定することができます。これはあなたが試してみたいことかもしれません。

最後に、非同期セーフな機能を使用している場合や、シグナルハンドラ内のOSによってプロセスに割り当てられたメモリセグメントの外側にあるポインタやメモリに何らかの形でアクセスしている場合にも問題が発生する可能性があります。

2

あなたのシグナルハンドラがあなたのシグナルハンドラで捕捉されていない別のシグナルを引き起こした場合、無限ループのようになります。