2013-05-22 21 views
7

私のアプリケーションがセグメンテーションフォルトでクラッシュしたとき、システムからコアダンプを取得したいと思います。私は手を前にLinux:セグメンテーションフォルトを処理してコアダンプを取得する

ulimit -c unlimited 

を設定することで、私はまた、セグメンテーションフォールトが発生した私のアプリケーションログの表示がしたいことをやります。私はsigaction()を使ってそれを行います。しかし、私がそれを行うと、シグナルはデフォルトの処理には達しず、コアダンプは保存されません。

どうすればシステムコアのダンプと同時に自分のシグナルハンドラからのログラインをダンプすることができますか?

答えて

1

答え:フラグSA_RESETHANDでsigactionを設定して、ハンドラからただ返します。同じ命令が再び発生し、セグメンテーションフォールトが再び発生し、デフォルトのハンドラが呼び出されます。

+0

詳細を教えてください。 – Short

+0

私は恐れることができません。 – shoosh

+1

これは私がテストしていたRedhat 6のバージョンでは動作せず、ハンドラがリセットされない回帰ループが発生します。これは、sigactionを呼び出すときに古いハンドラを保存し、明示的にSIGSEGVハンドラでそれをリセットすると機能します。 – phenompbg

5
  1. SIGSEGVのデフォルトシグナルハンドラを上書きして、カスタムログ機能を呼び出します。
  2. ログに記録された後、コアダンプを作成するデフォルトハンドラを復元してトリガします。ここで

signalを使用したサンプルプログラムです:

void sighandler(int signum) 
{ 
    myLoggingFunction(); 

    // this is the trick: it will trigger the core dump 
    signal(signum, SIG_DFL); 
    kill(getpid(), signum); 
} 

int main() 
{ 
    signal(SIGSEGV, sighandler); 

    // ... 
} 

同じ考え方もsigactionで動作するはずです。

出典:How to handle SIGSEGV, but also generate a core dump

+0

私にとってうまくいったのはシグナルをシグナルに設定することでした(signum、SIG_DFL)。シグナルハンドラをリターンさせます。 – Vincent

関連する問題