如何检测段错误是否是由内存不足情况引起的?
我有一个段错误,无法通过 valgrind 和 duma/efence 进行诊断,因为它似乎使这些工具本身崩溃(Valgrind“不可能的事情发生了”,duma:“mprotect()失败:无法分配内存”)
应用程序(Gazebo)只是因段错误而崩溃,并且堆栈跟踪似乎没有提供很多关于原因的提示。
TLDR: 是否有一种简单的工具或方法可以确认或排除内存不足的情况是导致段错误的原因?
(顶部没有显示崩溃前过多的内存使用量)
在 Linux 上,内存不足情况可以通过以下两种方式之一表现出来:
- 如果禁用过度使用,则会出现
brk()
or mmap()
呼叫失败ENOMEM
。此后不久,应用程序尝试取消引用从返回的 NULL 指针malloc()
和崩溃。
- 如果启用了过量使用,那么 OOM 杀手就会启动,并使用 SIGKILL 终止进程。 dmesg 中留下一条消息。
因此,您可以通过检查 strace 是否不显示来排除 OOMbrk()
or mmap()
呼叫失败ENOMEM
,并验证 dmesg 中没有出现 OOM 杀手消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)