有效内存分段错误

Posted

技术标签:

【中文标题】有效内存分段错误【英文标题】:Segmentation fault on valid memory 【发布时间】:2010-11-18 16:02:46 【问题描述】:

我在访问一个在 gdb 中看起来有效且完全可访问的对象时遇到分段错误。分段不总是与无法访问的内存有关吗?

编辑:更多细节。

崩溃发生在 gdb 下,所以我可以检查对象的内存。它已将成员设置为正确的值,因此我没有机会访问只读内存。发生崩溃的指令类似于Var = Obj.GetMember(),其中 Var、GetMember 和相应的成员是短整数。 错位?我想这会导致总线错误,而不是分段。我会努力重建一切。问题是这段代码每秒运行数千次,并且分段发生在几天内。

【问题讨论】:

尝试 valgrind 检查内存损坏。 【参考方案1】:

尝试完全重建(make clean && make),当我遇到这种奇怪的错误时,这对我有好几次帮助。

后期更新:

如果这确实解决了问题,则通常意味着您的 makefile 有问题,通常是 .cpp 和 .h 文件之间的依赖关系搞砸了,例如:a.cpp 包含 b.h,但 b.h 未列在 a .cpp 的依赖。

【讨论】:

几周前我问了一个问题。 ***.com/questions/3997404/…【参考方案2】:

即使在某些情况下访问“有效”内存也会出现错误:

您正在尝试修改内存,但特定映射是只读的 您正试图在不可执行的内存区域中执行代码 您正在尝试例如在未对齐的地址加载/存储,并且您的硬件出现对齐异常

如果不查看核心转储,就无法确定错误指令(加载/存储/执行)是什么以及访问内存的映射权限究竟是什么。

【讨论】:

【参考方案3】:

基本上,是的。您是否使用核心转储来分析您的 seg 错误?

【讨论】:

【参考方案4】:

代码会很有帮助,但是你做了清理吗?如果您增加了类的大小并且您的依赖项不正确,那么将不会为实例分配足够的空间,然后该类将溢出并破坏它在内存中的任何内容。

【讨论】:

以上是关于有效内存分段错误的主要内容,如果未能解决你的问题,请参考以下文章

什么是分段错误?

尝试锁定共享内存互斥体时出现分段错误

访问共享内存时出现分段错误

由于 C 中的内存不足导致的分段错误

分段错误与页面错误

初始化数组时出现段错误