【问题标题】:application failed (make Killed)应用程序失败(使被杀死)
【发布时间】:2017-05-24 10:20:19
【问题描述】:

我已经通过 make 文件编译了我的 cpp 文件。我也通过这个 make 文件运行了我的文件。

这个多线程应用程序也使用了 99% 的 CPU。我使用Ubuntu 16.04.1 LTS 作为我的操作系统。

运行了三天后,我发现应用突然停止了,我在终端上看到了这个意外的错误信息。

Makefile:: recipe for target 'myMain' failed
make: *** myMain Killed

没有其他错误信息。此应用程序失败,没有异常错误消息。尽管没有人编写完整的证明应用程序,但我对我编写的程序(关于失败)非常有信心。

我也从未见过make: *** something Killed的消息。

不幸的是,这是一个我不能轻易地一次又一次地重复以查看问题所在的情况。

我想知道make 应用程序或Ubuntu 是否有任何机制可以在长时间运行并占用大量资源时杀死任何应用程序?

更新

感谢用户Basile Starynkevitch,这是我从dmesg收到的结果:

[351059.556308] Out of memory: Kill process 2794 (main) score 882 or sacrifice child
[351059.556318] Killed process 2794 (main) total-vm:30432908kB, anon-rss:13530324kB, file-rss:0kB

【问题讨论】:

  • 考虑使用valgrind 来调试您的应用程序。您还可以限制内存(例如,使用 bash shell 的 ulimit 内置)
  • @BasileStarynkevitch,你说的很棒。然而,再次运行这个应用程序并让它运行几天直到它崩溃是一个非常困难的过程。 dmesg 已经显示了我应该解决的问题。

标签: c++ ubuntu makefile kill


【解决方案1】:

您的程序很可能是 Linux 内核 OOM Killer 的受害者。另请参阅question and answers

【讨论】:

  • 也使用dmesg 并查看/var/log/ 文件,尤其是syslogmessages
  • 我想知道为什么我的应用程序使用如此大量的 RAM。没有内存泄漏,因为它遵循 C++ 指南。
  • 另外,我想知道make是如何意识到这个进程被杀死而不是自己终止的。
  • 如果您有更多问题,可能会发布一个新问题。显然,您的应用程序使用了大量内存,但这可能是设计使然,而不是泄漏。
  • 进程死亡的原因对父进程可见(在本例中为make)。父进程在子进程死亡时收到的值编码了诸如退出代码(如果它正常退出)、它接收到的导致它死亡的信号、它是否转储核心等信息。因此,make 知道进程死亡是因为它被 SIGKILL (9) 杀死,这就是 OOM Killer 杀死事物的方式。
【解决方案2】:

内存不足:杀死进程

您很可能正在以用户身份编译源代码,并且您的环境受到ulimit -a 命令列出的资源限制(内存或进程数)的限制。一旦达到硬限制,该进程就会被 Linux 内核杀死。

如果你有足够的内存,可以增加这些限制(ulimit -Sv),否则你需要增加你机器的内存或者增加一些extra swap space

有关此行为的更多详细信息,请参阅:Kernel - Out Of Memory Management

当机器内存不足时,旧的页面框架将被回收,但尽管回收页面可能会发现它无法释放足够的页面来满足请求,即使以最高优先级扫描。如果确实无法释放页框,则调用out_of_memory() 以查看系统是否内存不足并需要终止进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多