Linux 如何检测内存不足故障?

Linux 如何检测内存不足故障?,linux,memory-management,segmentation-fault,out-of-memory,Linux,Memory Management,Segmentation Fault,Out Of Memory,如何检测segfault是否由内存不足引起 我有一个segfault无法通过valgrind和duma/efence进行诊断,因为它似乎会使这些工具本身崩溃(valgrind“不可能发生的事”,duma:“mprotect()失败:无法分配内存”) 应用程序(Gazebo)只是因为一个segfault和一个堆栈跟踪而崩溃,而堆栈跟踪似乎没有提供很多关于原因的提示 TLDR:是否有一种简单的工具或方法来确认或排除导致SEGFULT的内存不足情况? (top不会显示崩溃前内存使用过多)在Linux上

如何检测segfault是否由内存不足引起

我有一个segfault无法通过valgrind和duma/efence进行诊断,因为它似乎会使这些工具本身崩溃(valgrind“不可能发生的事”,duma:“mprotect()失败:无法分配内存”)

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

TLDR:是否有一种简单的工具或方法来确认或排除导致SEGFULT的内存不足情况?


(top不会显示崩溃前内存使用过多)

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

  • 如果禁用了Overmit,则调用
    brk()
    mmap()
    将失败,并使用
    ENOMEM
    。此后不久,应用程序尝试取消引用从
    malloc()
    返回的空指针,并崩溃
  • 如果启用了overmit,那么OOM killer将启动,并使用SIGKILL终止进程。dmesg中会留下一条消息

因此,您可以通过检查strace没有显示
brk()
mmap()
调用在
ENOMEM
中失败,并验证dmesg中没有出现OOM杀手消息来排除OOM。在Linux上,内存不足情况可以通过以下两种方式之一表现出来:

  • 如果禁用了Overmit,则调用
    brk()
    mmap()
    将失败,并使用
    ENOMEM
    。此后不久,应用程序尝试取消引用从
    malloc()
    返回的空指针,并崩溃
  • 如果启用了overmit,那么OOM killer将启动,并使用SIGKILL终止进程。dmesg中会留下一条消息

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

因此,如果我执行了strace-c,并且没有看到brk或mmap出现错误,这100%不是内存不足问题(假设dmes没有显示OOM killer信息)?[edit:typo fix]strace不是systrace。但是,是的,您可以使用“sysctl vm.Overmit_memory”查看内核使用的是什么Overmit策略。它可能是0,这很难解释,但无论如何都值得知道。此外,请检查strace()日志中的mremap(),这是glibc在增加堆栈时使用的。因此,如果我使用strace-c,并且没有看到brk或mmap的错误,这100%不是内存不足问题(假设dmes没有显示OOM杀手信息)?[edit:typo fix]strace不是systrace。但是,是的,这和检查dmesgYou可以使用“sysctl vm.overmit\u memory”查看您的内核正在使用什么样的过度限制策略。它可能是0,这很难解释,但无论如何都值得知道。另外,请检查strace()日志中的mremap(),这是glibc在扩展堆栈时使用的。