我想为 linux 编写一个 c++ 程序,它监视所有正在运行的进程并在任何这些进程由于 sigsegv 崩溃时写入日志文件。
是否有可能做到这一点,如果可以,我应该学习什么才能在 C++ 中实现它?
我想为 linux 编写一个 c++ 程序,它监视所有正在运行的进程并在任何这些进程由于 sigsegv 崩溃时写入日志文件。
是否有可能做到这一点,如果可以,我应该学习什么才能在 C++ 中实现它?
试图监视系统上的所有进程将是繁重的。如果您特别对 SIGSEGV 感兴趣,您可能需要考虑将自己安装为核心转储处理程序。它不会捕获已要求禁用核心转储的进程 ( ulimit -c 0
),但您会得到所有其他进程。
echo "|usr/local/sbin/crashcollector" >/proc/sys/kernel/core_pattern
Now/usr/local/sbin/crashcollector
将在每次进程崩溃时在其标准输入上调用核心转储。该程序可以做它想做的任何事情,例如保存核心转储和/或通知其他内容。
我希望你能捕捉到所有进程的崩溃事件。使用 ptrace 是一种方法,但它非常复杂,您需要跟踪所有进程并附加到以后创建的新进程,而且您会遇到性能损失。
您可以通过 hook 捕获所有进程崩溃事件coredump
:
echo "|yourcoredumphook" > /proc/sys/kernel/core_pattern
这将启用 coredump 钩子,当进程终止时,yourcoredumphook
将以 root 身份启动,并通过 stdin 发送 coredump,因此您可以通过分析 coredump 来确定哪个进程终止
你可能想用ptrace
这个。看看这个问题:
如何拦截linux信号?(在 C 中)
我想对所有进程执行此操作将需要重新实现 init,或者可能需要一个监视 sys 目录以调用ptrace
每个进程的系统。