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

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

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

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

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

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

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

最佳答案

在 Linux 上,内存不足的情况可能表现为以下两种方式之一:

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

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

关于linux - 如何检测内存不足的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6132333/

相关文章:

c++ - CUDA 编译和链接

java - ldap超时在linux中不起作用

c++ - 如何通过引用或指针传递的指针正确释放函数中分配的 main 内存?

c++ - 使用二维指针数组时出现段错误

c - 在 C 中实现双堆栈以在命令行上计算数学表达式。(段错误)

c++ - 实例化结构时出现段错误 - C++

linux - 如何在启动时运行两个shell脚本?

linux - Bash shell 问题 : Error occurs when running a simple shell script

c++ - 当您不知道确切的元素数量但可以估计上限时,分配比数组所需更多的内存是否可以?

C++ 内存管理和 Misra