问题描述
|
如何检测内存不足是否引起了段错误?
我有一个segfault,它无法通过valgrind和duma / efence进行诊断,因为它似乎使那些工具本身崩溃了(Valgrind \“发生意外情况”,duma:\“ mprotect()失败:无法分配内存\”)
该应用程序(Gazebo)仅因出现段错误而崩溃,并且堆栈跟踪似乎并未提供许多提示。
TLDR:是否有简单的工具或方法来确认或排除内存不足情况是段错误的原因?
(顶部未显示崩溃前过多的内存使用)
解决方法
在Linux上,内存不足情况可以通过以下两种方式之一来体现:
如果禁用了过量使用,则
brk()
或mmap()
呼叫将失败,并出现ENOMEM
。此后不久,应用程序尝试取消引用从“ 3”返回的NULL指针,并崩溃。
如果启用了过量使用,则OOM杀手将启动,并使用SIGKILL杀死该进程。消息留在dmesg中。
这样,您可以通过以下方法排除OOM:检查strace不显示ѭ0或ѭ1失败的ENOMEM
,并验证dmesg中是否没有OOM杀手消息。