如何检测段错误是否由内存不足情况引起?
我有一个段错误无法通过 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/