3

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

是否有可能做到这一点,如果可以,我应该学习什么才能在 C++ 中实现它?

4

3 回答 3

4

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

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

Now/usr/local/sbin/crashcollector将在每次进程崩溃时在其标准输入上调用核心转储。该程序可以做它想做的任何事情,例如保存核心转储和/或通知其他内容。

于 2012-06-20T13:58:50.047 回答
4

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

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

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

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

于 2012-06-20T14:07:04.130 回答
0

你可能想用ptrace这个。看看这个问题: 如何拦截linux信号?(在 C 中)

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

于 2012-06-20T13:49:45.530 回答