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

时间:2011-05-25 23:58:48

标签: linux memory-management segmentation-fault out-of-memory

如何检测段内故障是否是由内存不足情况引起的?

我有一个段错误,无法通过valgrind和duma / efence进行诊断,因为它似乎会自动崩溃这些工具(Valgrind“发生了一次”,duma:“mprotect()失败:无法分配内存”)

应用程序(Gazebo)只是崩溃了一个段错误,而堆栈跟踪似乎没有提供很多关于原因的提示。

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

(top在崩溃前没有显示过多的内存使用量)

1 个答案:

答案 0 :(得分:5)

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

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

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