如何检测段内故障是否是由内存不足情况引起的?
我有一个段错误,无法通过valgrind和duma / efence进行诊断,因为它似乎会自动崩溃这些工具(Valgrind“发生了一次”,duma:“mprotect()失败:无法分配内存”)
应用程序(Gazebo)只是崩溃了一个段错误,而堆栈跟踪似乎没有提供很多关于原因的提示。
TLDR:是否有一个简单的工具或方法来确认或排除内存不足情况是导致段错误的原因?
(top在崩溃前没有显示过多的内存使用量)
答案 0 :(得分:5)
在Linux上,内存不足的情况可以通过以下两种方式之一表现出来:
brk()
或mmap()
调用将失败并显示ENOMEM
。此后不久,应用程序尝试取消引用从malloc()
返回的NULL指针并崩溃。因此,您可以通过检查strace是否显示brk()
或mmap()
调用失败ENOMEM
并验证dmesg中没有OOM杀手消息显示来排除OOM。