有效内存上的分段错误

时间:2010-11-18 16:02:47

标签: c++ linux memory segmentation-fault

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

编辑:更多细节。

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

4 个答案:

答案 0 :(得分:2)

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

  • 您正在尝试修改内存,但具体的映射是readonly
  • 您正在尝试在无执行的内存区域中执行代码
  • 你正试图例如在未对齐的地址加载/存储,并且硬件发生对齐异常

不看coredump,弄清楚故障指令(加载/存储/执行)是什么,以及访问内存的映射权限究竟是什么,这是不可能区分的。

答案 1 :(得分:2)

尝试完全重建(make clean&& make),当我遇到如此奇怪的错误时,这曾帮助了我几次。

晚UPD:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

代码非常有帮助,但你做过干净吗?如果你增加了一个类的大小并且你的依赖关系不正确,那么就没有足够的空间分配给一个实例,那么该类将会溢出并破坏它在内存中的任何内容。