13

アプリケーションがセグメンテーション違反でクラッシュしたときに、システムからコア ダンプを取得したいと考えています。私は事前に設定することでそれを行います

ulimit -c unlimited

また、セグメンテーション エラーが発生したことをアプリケーション ログに記録したいと考えています。を使用してそれを行いsigaction()ます。ただし、これを行うと、シグナルがデフォルトの処理に到達せず、コア ダンプが保存されません。

両方のシステム コア ダンプを自分のシグナル ハンドラから同時にログに出力するにはどうすればよいですか?

4

2 に答える 2

11
  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です。

出典: SIGSEGV の処理方法とコア ダンプの生成方法

于 2013-10-11T00:48:52.453 に答える
2

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

于 2013-05-23T15:19:09.630 に答える