2

子プロセスをフォークする SIGSEV および SIGABRT シグナル ハンドラをインストールしました。1. SIGSTOP で親プロセスを停止します。2. 親プロセスで gdb を呼び出して、クラッシュ診断を収集します。

問題は、pthread_atfork ハンドラーをインストールする ptmalloc のおかげで、glibc でフォークが非同期シグナルに対して安全ではないことです。fork() がメモリを割り当てようとするため、シグナル ハンドラがフリーズする可能性があります。これは、すでにロックされているミューテックスを取得する可能性があります。

fork システム コールを直接呼び出し、libc ラッパーをバイパスして、atfork ハンドラをバイパスすることで、この問題を回避したいと考えています。それ、どうやったら出来るの?次のコードは Linux では動作しますが、OS X では動作しないようです。常に子 PID を返し、決して 0 ではありませんか? int syscall(...)また、定義はbut fork が type の整数を返すため、戻り値を正しくキャプチャしているかどうかもわかりませんpid_t

pid = syscall(SYS_fork);

私のアプリは、Linux や OS X など、多くのプラットフォームで実行されます。

編集: タイプミスを修正: s/thread safe/async signal safe/.

4

1 に答える 1

0

Linuxでは、ソフトウェアのコアダンプ信号でデバッガーを自動的に起動したい場合は、コアダンプパイプをスクリプトに組み込むことができます。core (5)coredump_filterによれば 、| (パイプ文字の後にコマンド)で開始する必要があります。。

このトリックは、余分なプログラミングを回避します(そのために作成したスクリプトを除く)

于 2012-07-03T05:18:52.740 に答える