我的应用程序崩溃并出现退出代码:9(SIGKILL)。
我从未运行过像 'kill -9 (pid)' 或 'pkill (process name)' 这样的指令来杀死正在运行的进程。
在这种情况下,我该从哪里开始调试?
当程序崩溃时,我尝试通过转储堆栈跟踪来找到问题,但发现 SIGKILL 无法被捕获进行错误处理。
该程序使用 MPI 并在集群环境中运行。它在运行约 1 小时后停止。
有哪些常见原因可能导致 SIGKILL 异常?
(运行在 Linux;CentOS 7 上)
我的应用程序崩溃并出现退出代码:9(SIGKILL)。
我从未运行过像 'kill -9 (pid)' 或 'pkill (process name)' 这样的指令来杀死正在运行的进程。
在这种情况下,我该从哪里开始调试?
当程序崩溃时,我尝试通过转储堆栈跟踪来找到问题,但发现 SIGKILL 无法被捕获进行错误处理。
该程序使用 MPI 并在集群环境中运行。它在运行约 1 小时后停止。
有哪些常见原因可能导致 SIGKILL 异常?
(运行在 Linux;CentOS 7 上)
我回答自己的问题是为了帮助其他人。
异常是由OutOfMemory引起的。
该进程分配了太多内存,对操作系统造成了压力。操作系统有一个“杀手”oom-killer,为了系统稳定性而杀死这样的进程。oom-killer使用名为SIGKILL的子弹。
然而,由于SIGKILL是不可见的(应用程序无法捕获和处理它),对于一些新手,包括我在内,往往不容易找到崩溃的真正原因。
好消息是,当“杀手”杀死您的进程时,它总是会在/var/log/messages中记录它的行动。
根据您的操作系统配置,oom-killer可能根本不记录任何消息。在这种情况下,您也可以进行配置。在Google中搜索rsyslog配置。
strace yourprogram
。这将产生大量输出;忽略除最后50行左右之外的所有内容。如果您不知道输出的含义,请在此处发布那些最后的50行,不要编辑它们。(它们无法适应评论。使用标签下的“编辑”链接来编辑您的问题文本。) - zwolvalgrind 'yourprogram'
。您是否控制正在运行的网络,或者可能会自动清理挂起的运行(即有人杀死您)? - kabanusstrace
输出将告诉我们是哪一个信号。 (我正在键入此文本的Linux框不会这样做,但CentOS 7可能不同) - zwol