【问题标题】:Segmentation fault on valid memory有效内存分段错误
【发布时间】:2010-11-18 16:02:46
【问题描述】:
我在访问一个在 gdb 中看起来有效且完全可访问的对象时遇到分段错误。分段不总是与无法访问的内存有关吗?
编辑:更多细节。
崩溃发生在 gdb 下,所以我可以检查对象的内存。它已将成员设置为正确的值,因此我没有机会访问只读内存。发生崩溃的指令类似于Var = Obj.GetMember(),其中 Var、GetMember 和相应的成员是短整数。
错位?我想这会导致总线错误,而不是分段。我会努力重建一切。问题是这段代码每秒运行数千次,并且分段发生在几天内。
【问题讨论】:
标签:
c++
linux
memory
segmentation-fault
【解决方案1】:
尝试完全重建(make clean && make),当我遇到这种奇怪的错误时,这对我有好几次帮助。
后期更新:
如果这确实解决了问题,则通常意味着您的 makefile 有问题,通常是 .cpp 和 .h 文件之间的依赖关系搞砸了,例如:a.cpp 包含 b.h,但 b.h 未列在 a .cpp 的依赖。
【解决方案2】:
即使在某些情况下访问“有效”内存也会出现错误:
- 您正在尝试修改内存,但特定映射是只读的
- 您正试图在不可执行的内存区域中执行代码
- 您正在尝试例如在未对齐的地址加载/存储,并且您的硬件出现对齐异常
如果不查看核心转储,就无法确定错误指令(加载/存储/执行)是什么以及访问内存的映射权限究竟是什么。
【解决方案3】:
基本上,是的。您是否使用核心转储来分析您的 seg 错误?
【解决方案4】:
代码会很有帮助,但是你做了清理吗?如果您增加了类的大小并且您的依赖项不正确,那么将不会为实例分配足够的空间,然后该类将溢出并破坏它在内存中的任何内容。