C++程序崩溃并显示退出代码:9(SIGKILL)

30

我的应用程序崩溃并出现退出代码:9(SIGKILL)。

我从未运行过像 'kill -9 (pid)' 或 'pkill (process name)' 这样的指令来杀死正在运行的进程。

在这种情况下,我该从哪里开始调试?

  1. 当程序崩溃时,我尝试通过转储堆栈跟踪来找到问题,但发现 SIGKILL 无法被捕获进行错误处理。

  2. 该程序使用 MPI 并在集群环境中运行。它在运行约 1 小时后停止。

有哪些常见原因可能导致 SIGKILL 异常?

(运行在 Linux;CentOS 7 上)


1
从shell提示符中运行strace yourprogram。这将产生大量输出;忽略除最后50行左右之外的所有内容。如果您不知道输出的含义,请在此处发布那些最后的50行,不要编辑它们。(它们无法适应评论。使用标签下的“编辑”链接来编辑您的问题文本。) - zwol
1
在调试器中运行程序以捕获信号。 - Some programmer dude
1
正如Mathieu Van Nevel所提到的,如果可用,尝试使用valgrind 'yourprogram'。您是否控制正在运行的网络,或者可能会自动清理挂起的运行(即有人杀死您)? - kabanus
2
@syko:这是一种可能性,因为OOM会发送SIGKILL信号,请参见此答案此答案建议您检查日志以确定是否出现了这种情况。 - stefaanv
一些Unix迭代版本如果进程阻塞或忽略同步致命信号(如SIGSEGV、SIGILL等),然后执行会导致其中一个信号被生成的操作,也会生成SIGKILL。 strace输出将告诉我们是哪一个信号。 (我正在键入此文本的Linux框不会这样做,但CentOS 7可能不同) - zwol
显示剩余8条评论
1个回答

52

我回答自己的问题是为了帮助其他人。

异常是由OutOfMemory引起的。

该进程分配了太多内存,对操作系统造成了压力。操作系统有一个“杀手”oom-killer,为了系统稳定性而杀死这样的进程。oom-killer使用名为SIGKILL的子弹。

然而,由于SIGKILL是不可见的(应用程序无法捕获和处理它),对于一些新手,包括我在内,往往不容易找到崩溃的真正原因。

好消息是,当“杀手”杀死您的进程时,它总是会在/var/log/messages中记录它的行动。

根据您的操作系统配置,oom-killer可能根本不记录任何消息。在这种情况下,您也可以进行配置。在Google中搜索rsyslog配置。

查找Linux OOM killer杀死的进程


1
我在 Jenkins 上遇到了这个错误,结果发现构建确实因为 OOM 被杀掉了。谢谢! - Mikhail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接