有效内存分段错误
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】:代码会很有帮助,但是你做了清理吗?如果您增加了类的大小并且您的依赖项不正确,那么将不会为实例分配足够的空间,然后该类将溢出并破坏它在内存中的任何内容。
【讨论】:
以上是关于有效内存分段错误的主要内容,如果未能解决你的问题,请参考以下文章