如何检测内存不足段错误?

如何检测segfault是否由内存不足造成的?

我有一个段错误,valgrind和duma / efence,因为它似乎崩溃这些工具(Valgrind“不可能发生的事情”,杜马:“mprotect()失败:无法分配内存”诊断)

应用程序(Gazebo)只是崩溃了一个段错误,堆栈跟踪似乎没有提供许多提示,为什么。

TLDR: 是否有简单的工具或方法来确认或排除内存不足的情况是导致段错误的原因?

(顶部在崩溃前不显示过多的内存使用量)

在Linux上,内存不足的情况可以通过以下两种方式之一来体现:

  • 如果overcommit被禁用,则brk()mmap()调用将失败,并使用ENOMEM 。 此后不久,应用程序尝试解除从malloc()返回的NULL指针的引用并崩溃。
  • 如果overcommit被启用,那么OOM杀手会踢,并用SIGKILL杀死进程。 消息留在dmesg中。

因此,您可以通过检查strace未显示与ENOMEM失败的brk()mmap()调用并验证dmesg中是否显示OOM杀手消息来排除OOM。