子プロセスをフォークする 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/.