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

Cat*_*kul 1 linux memory-management out-of-memory segmentation-fault

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

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

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

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

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

bdo*_*lan 5

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

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

因此,您可以通过检查strace未显示brk()mmap()调用失败来排除ENOMEMOOM,并验证在dmesg 中不显示任何OOM杀手消息.

  • 您可以使用"sysctl vm.overcommit_memory"来查看内核使用的overcommit策略.它可能是0,这很难解释,但无论如何值得知道.另外,检查strace()日志中的mremap(),这是glibc在增长堆栈时使用的. (2认同)