3

実行中のすべてのプロセスを監視し、sigsegvが原因でこれらのプロセスのいずれかがクラッシュしたときにログファイルに書き込むLinux用のc++プログラムを作成したいと思います。

これを行うことは可能ですか?もしそうなら、C ++でそれを実装するために何を学ぶべきですか?

4

3 に答える 3

4

システム上のすべてのプロセスを監視しようとするのは面倒です。特に SIGSEGV に関心がある場合は、代わりにコア ダンプ ハンドラーとして自分自身をインストールすることを検討してください。コア ダンプを無効にするように要求したプロセス ( ) はキャッチされませんulimit -c 0が、他のすべてのプロセスは取得されます。

echo "|usr/local/sbin/crashcollector" >/proc/sys/kernel/core_pattern

/usr/local/sbin/crashcollectorプロセスがクラッシュするたびに、標準入力のコア ダンプで呼び出されるようになりました。このプログラムは、コア ダンプの保存やその他の通知など、必要なことは何でも実行できます。

于 2012-06-20T13:58:50.047 に答える
4

すべてのプロセスのクラッシュ イベントをキャッチできると思います。ptrace の使用はアプローチですが、非常に複雑です。すべてのプロセスをトレースし、後で作成される新しいプロセスにアタッチする必要があり、パフォーマンスが低下します。

フックですべてのプロセスのクラッシュ イベントをキャッチできますcoredump

echo "|yourcoredumphook" > /proc/sys/kernel/core_pattern

これにより、コアダンプ フックが有効になり、プロセスが終了すると、yourcoredumphookstdin を介してコアダンプが送信されてルートとして開始されるため、コアダンプを分析して終了したプロセスを特定できます。

于 2012-06-20T14:07:04.130 に答える
0

おそらくこれに使用したいと思うでしょうptrace。この質問を見てください: Linux シグナルを傍受する方法は? (C)

すべてのプロセスに対してこれを行うには、init の再実装、またはptrace各プロセスを呼び出すために sys ディレクトリを監視するシステムが必要になると思います。

于 2012-06-20T13:49:45.530 に答える