我正在开发一个大型应用程序,该应用程序产生了许多处理各种任务的流程。在某些情况下,由于内存压力,操作系统将终止我的进程之一。没关系,完全可以预期,父进程可以很好地处理此问题。
我想知道的是找出进程被杀死的原因。如果它是由于记忆压力而被杀死的,我想稍后再进行处理。如果它是由于其他任何原因而被杀死的,例如由于断言失败或超出范围的内存访问,我想记录下来并进行调查。
所以,这是我的问题:您如何确定由于操作系统需要内存而杀死了一个子进程?
问题适用于:
进程不是不是以root / admin身份运行。
答案 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]