检测到由于操作系统内存不足而导致子进程终止

Detecting that a child process was killed because the OS is out of memory

本文关键字:子进程 终止 内存不足 操作系统 检测      更新时间:2023-10-16

我正在开发一个大型应用程序,该应用程序产生了许多处理各种任务的进程。在某些情况下,由于内存压力,操作系统会杀死我的一个进程。没关系,这完全是意料之中的事,父进程处理得很优雅。

我想知道的是找出一个进程被终止的原因。如果它是因为记忆压力而死亡的,我想稍后重新进行治疗。如果它是因为任何其他原因而被杀死的——比如说,因为断言失败或内存访问越界,我想记录并调查一下。

所以,我的问题是:你如何发现一个子进程因为操作系统需要内存而被杀死?

问题适用于:

  • Windows
  • MacOS
  • Linux
  • (对于奖励积分,我也对安卓系统感兴趣,但这不是我的首要任务(

进程不是以root/admin身份运行的。

在Linux上,您可以读取syslog来了解进程是否被操作系统杀死。您可以通过读取syslog(在某些发行版上为/var/log/messages或/var/log/syslog(或通过dmesg命令对其进行调查。如果你派生了进程,你也可以检测到它是用SIGKILL(9)信号杀死的,而不是对应于应用程序本身崩溃的SIGSEGV(11)信号,以及意味着应用程序被正常终止的SIGINT(2)/SIGTERM(15)信号。

关于Windows,我只知道这种类型的监控可以通过Application Event Log启用。有一个GUI应用程序可以帮助您进行设置。

当操作系统为了终止而干预进程的执行时,它会通过信号来执行。

(在基于IX/类似IX的平台上(可以做的是--dmesg。

它输出内核活动日志。从那里,您可以识别发送到流程的信号。

例如下面的代码--

#include <stdio.h>
int main (void)
{
char *p = NULL;
printf ("n%c", *p);
return 0;
}

导致这是从dmesg获得的--

[8478285.606105] crash.out[16830]: segfault at 0 ip 0000000000400531 sp 00007fffc373b090 error 4 in crash.out[400000+1000]