用于sigsegv的c ++ linux监视进程

时间:2012-06-20 13:37:48

标签: c++ linux sigsegv

我想为linux编写一个c ++程序,它监视所有正在运行的进程,并在由于sigsegv而导致任何进程崩溃时写入日志文件。

是否可以这样做,如果是这样,我应该学习什么才能在c ++中实现它?

3 个答案:

答案 0 :(得分:4)

尝试监控系统上的所有进程将是繁重的。如果您对SIGSEGV特别感兴趣,可能需要考虑将自己安装为核心转储处理程序。它不会捕获要求禁用核心转储的进程(ulimit -c 0),但是您将获得所有其他进程。

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

现在每次进程崩溃时,都会在其标准输入上调用核心转储来调用/usr/local/sbin/crashcollector。该程序可以执行任何操作,例如保存核心转储和/或通知其他内容。

答案 1 :(得分:4)

我希望你能抓住所有进程崩溃事件。使用ptrace是一种方法,但它非常复杂,您需要跟踪所有进程并附加到以后创建的新进程,您也会遇到性能损失。

您可以通过挂钩coredump捕获所有进程崩溃事件:

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

这将启用coredump挂钩,当进程终止时,yourcoredumphook将以root身份启动,coredump通过stdin发送,因此您可以通过分析coredump找出终止哪个进程

答案 2 :(得分:0)

您可能希望使用ptrace。看看这个问题: how to intercept linux signals ? (in C)

我想为所有进程执行此操作需要重新实现init,或者可能是监视sys目录的系统,以便为每个进程调用ptrace