检测到由于操作系统内存不足而导致子进程终止
Detecting that a child process was killed because the OS is out of memory
我正在开发一个大型应用程序,该应用程序产生了许多处理各种任务的进程。在某些情况下,由于内存压力,操作系统会杀死我的一个进程。没关系,这完全是意料之中的事,父进程处理得很优雅。
我想知道的是找出一个进程被终止的原因。如果它是因为记忆压力而死亡的,我想稍后重新进行治疗。如果它是因为任何其他原因而被杀死的——比如说,因为断言失败或内存访问越界,我想记录并调查一下。
所以,我的问题是:你如何发现一个子进程因为操作系统需要内存而被杀死?
问题适用于:
- 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]
相关文章:
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 检测到由于操作系统内存不足而导致子进程终止
- 使用信号检测子进程何时终止的最佳方法是什么?
- 无法检测子进程是否已终止
- 我无法使用终止进程杀死子进程
- 子进程在 fork 中 3 秒后自行终止
- 截获非终止子进程C++的stdout
- 当父NT服务被终止/崩溃时,终止子进程
- Fork进程:在子进程终止时恢复父进程(Linux)
- 在所有子进程终止后,不能运行父进程
- Dup2()导致子进程提前终止
- 从Python子进程终止时的c++调用函数
- CreateProcess,使子进程在父进程被终止时被终止
- 何时应该终止MPI子进程
- 杀死父进程时终止所有子进程