我正在开发一款游戏。在某些地方,有时我会收到分段错误,而在其他任何时候代码都能正常工作。如果我再次运行游戏(在收到分段错误后)它会恢复(没有任何代码更改)并且运行正常。但经过一段时间后,这种情况就会发生。
我尝试使用GDB进行调试。我收到了以下信息:
任何想法为什么会这样?
答案 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);
}
由于您没有提供足够的信息,因此无法诊断问题的确切性质。