1

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

我尝试使用 GDB 对其进行调试。我得到以下信息:

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

任何想法为什么会发生这种情况?

4

3 回答 3

6

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

于 2012-09-28T18:07:15.530 回答
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替代品

有没有很好的 Valgrind 替代 Windows?

你的程序是多线程的吗?非确定性的一个来源是竞争条件

于 2012-09-28T18:44:52.153 回答
0

由于存在 C++ 标记,但您说您正在调用 then 函数:func(&s.x),那么鉴于它在其参数参数中func收到的说法让我相信实际上是一个未正确初始化的引用。例如,考虑:0xbs

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);
}

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

于 2012-09-28T18:13:40.990 回答