我想为linux编写一个c++程序,它可以监控所有运行的进程,并在其中任何一个进程由于sigsegv而崩溃时写入日志文件。
可以做到这一点吗?如果可以,我应该学习什么才能在c++中实现它?
发布于 2012-06-20 21:58:50
尝试监视系统上的所有进程将是繁重的。如果您对SIGSEGV特别感兴趣,那么您可能需要考虑将自己安装为核心转储处理程序。它不会捕获要求禁用核心转储(ulimit -c 0)的进程,但您将获得所有其他进程。
echo "|usr/local/sbin/crashcollector" >/proc/sys/kernel/core_pattern现在,每次进程崩溃时,都会在其标准输入上使用核心转储调用/usr/local/sbin/crashcollector。这个程序可以做它想做的任何事情,比如保存核心转储和/或通知其他事情。
发布于 2012-06-20 22:07:04
我希望你能捕捉到所有进程的崩溃事件。使用ptrace是一种方法,但它非常复杂,您需要跟踪所有进程并附加到稍后创建的新进程,而且还会造成性能损失。
您可以通过钩子coredump捕获所有进程崩溃事件
echo "|yourcoredumphook" > /proc/sys/kernel/core_pattern这将启用核心转储挂钩,当进程终止时,yourcoredumphook将以根用户身份启动,并通过标准输入发送核心转储,因此您可以通过分析核心转储来确定哪个进程终止
发布于 2012-06-20 21:49:46
为此,您可能需要使用ptrace。看一下这个问题:how to intercept linux signals ? (in C)
我认为对所有进程执行此操作都需要重新实现init,或者可能需要一个监视sys目录的系统为每个进程调用ptrace。
https://stackoverflow.com/questions/11120865
复制相似问题