【问题标题】:C++ program crashes with EXIT CODE: 9 (SIGKILL)C++ 程序因 EXIT CODE 崩溃:9 (SIGKILL)
【发布时间】:2017-04-14 18:20:44
【问题描述】:

我的应用程序因 EXIT CODE: 9 (SIGKILL) 而崩溃

我从不运行任何可以杀死正在运行的进程的命令,例如“kill -9 (pid)”或“pkill (process name)”。

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

  1. 我尝试在程序崩溃时转储堆栈跟踪,但发现无法捕获 SIGKILL 进行错误处理。

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

是否有任何常见原因会导致 SIGKILL 异常?

(在linux上运行;cent os 7)

【问题讨论】:

  • 你能发布一个堆栈跟踪吗?
  • strace yourprogram 来自 shell 提示符。这将产生大量的输出;忽略除最后 50 行左右之外的所有行。如果您不知道输出的含义,请在此处发布最后 50 行,未编辑。 (它们不适合 cmets。使用标签下的“编辑”链接来编辑问题的文本。)
  • 在调试器中运行程序来捕捉信号。
  • 正如 Mathieu Van Nevel 所提到的,如果可用,请尝试 valgring 'yourprogram'。您是否可以控制您运行的网络,或者是否可以自动清理挂起的运行(即有人杀死您)?
  • @syko:这是可能的,因为 OOM 会发送 SIGKILL,请参阅 this answerThis answer 建议你可以查看日志看看是不是这样。

标签: c++ error-handling


【解决方案1】:

@我回答我自己的问题,以便以后有人可以得到帮助。

异常是由 OutOfMemory 引起的。

进程分配了过多的内存给操作系统带来了压力。操作系统有一个杀手,oom-killer,为了系统稳定性而杀死这些进程。 oom-killer 使用称为 SIGKILL 的子弹。

但是,由于 SIGKILL 是不可见的(它无法被应用程序捕获和处理),对于包括我在内的一些新手来说,找出崩溃的真正原因并不总是那么容易。

一个好消息是,当杀手杀死您的进程时,它总是将其操作记录在 /var/log/messages。

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

Finding which process was killed by Linux OOM killer

【讨论】:

  • 我在 Jenkins 上遇到了这个错误,它导致构建确实由于 OOM 而被杀死。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多