随机分段故障

时间:2012-09-28 18:00:20

标签: c++ c segmentation-fault

我正在开发一款游戏。在某些地方,有时我会收到分段错误,而在其他任何时候代码都能正常工作。如果我再次运行游戏(在收到分段错误后)它会恢复(没有任何代码更改)并且运行正常。但经过一段时间后,这种情况就会发生。

我尝试使用GDB进行调试。我收到了以下信息:

  1. 有一个函数调用:func(& s.x),其中s是结构,x是int类型的成员。地址(& s.x)为0xb3456721
  2. 在函数func中,参数中接收的值为0xb。
  3. 程序崩溃,无法访问0xb处的内存。当我使用GDB打印变量时,我再次收到内存无法访问。
  4. 任何想法为什么会这样?

3 个答案:

答案 0 :(得分:2)

当给定相同输入时,有时会崩溃但不会崩溃的程序中有一个非确定性数据源。通常源是未初始化的变量或内存块,但它可能依赖于时间戳,进程ID或来自系统的其他输入源的变化。

答案 1 :(得分:1)

我之前在Linux上成功使用过valgrind来调试未初始化变量导致的非确定性行为。

这是我使用的valgrind命令,您的程序和选项应该遵循

valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes --track-origins=yes -v 

如果您在Windows上运行,请查看valgrind替换

的答案

Is there a good Valgrind substitute for Windows?

你的程序是多线程的吗?非确定性的一个来源是race condition

答案 2 :(得分:0)

由于C ++标记存在,但您说您正在调用,然后使用:func(&s.x),然后假设func说它在参数参数中收到0xb,则会导致我相信s实际上是一个未正确初始化的引用。例如,考虑:

struct foo {
    char a[12];
    int x;
};

void func (int *x) {
    *x = 0;
}

int main () {
    foo *sp = (foo *)-1;
    foo &s = *sp;
    func(&s.x);
}

由于您没有提供足够的信息,因此无法诊断问题的确切性质。