检测到子进程由于操作系统内存不足而被杀死

时间:2019-11-19 13:15:54

标签: c++ windows macos unix memory

我正在开发一个大型应用程序,该应用程序产生了许多处理各种任务的流程。在某些情况下,由于内存压力,操作系统将终止我的进程之一。没关系,完全可以预期,父进程可以很好地处理此问题。

我想知道的是找出进程被杀死的原因。如果它是由于记忆压力而被杀死的,我想稍后再进行处理。如果它是由于其他任何原因而被杀死的,例如由于断言失败或超出范围的内存访问,我想记录下来并进行调查。

所以,这是我的问题:您如何确定由于操作系统需要内存而杀死了一个子进程?

问题适用于:

  • Windows;
  • MacOS;
  • Linux;
  • (为了获得奖励积分,我也对Android感兴趣,但这不是我的优先考虑)。

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

2 个答案:

答案 0 :(得分:2)

在Linux上,您可以阅读syslog来确定进程是否被操作系统杀死。您可以通过阅读syslog(在某些发行版中为/ var / log / messages或/ var / log / syslog)或通过dmesg命令来进行调查。 如果您生成了该进程,则还可以检测到它是由SIGKILL(9)信号杀死的,而不是SIGSEGV(11)信号,该信号对应于应用程序本身全部崩溃,并且SIGINT(2) / { {1}}意味着该应用程序已正常终止。

关于Windows,我只知道可以通过SIGTERM(15)启用这种监视。有一个GUI Application可以帮助您进行设置。

答案 1 :(得分:0)

当操作系统为了杀死进程而干预执行过程时,它会通过信号进行干预。

您可以做的(在基于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]