静态var的奇怪条件只出现在gcc的调试版本中

时间:2010-12-19 19:32:59

标签: c debugging gcc gdb mingw

我有一个奇怪的情况,只出现在gcc -O0 -g输出上,而不是出现在gcc -O3上,而不出现在MSVC上,而不出现在MSVC调试输出上。

void func(void) {
  static int enabled;

  if (!enabled) {
    // do stuff
    enabled = 1;
   }

}

gcc -O0 -g上出现的问题只是有时启用会返回0.但并非总是如此,只是在执行程序的某些罕见点上。该函数通常循环通过它。有什么可以让它感到困惑呢?可以在外部改变“启用”吗?但它在里面宣布了。

编辑:有一种方法可以在函数内部设置为0,但之前是一个没有打印的大胖printf [并且在测试中根本没有合理的方式发生它条件]。它似乎根本没有任何明确启用= 0的内容。

EDIT2:它只由主线程调用。

EDIT3:它变得更奇怪了。它不会出现在linux gcc -O0 -g上,而只出现在mingw-w64 [gcc -O0 -g]上。

EDIT4:启用了一个rwatch和watch on看起来显示在某些if(!enabled)(应该只读)的情况下它被改变了。

EDIT5:在#tingw-w64的帮助下,如果'布尔序列'被颠倒,那么它似乎'修复',例如enabled初始化为1,然后设置为0.“通过将静态变量初始化为非零值,将其放入.data节”“所以存在关于lcomm的问题”“我假设你有一个缓冲区溢出代码中的其他一些地方“

1 个答案:

答案 0 :(得分:5)

我猜:你的某个地方有缓冲区溢出。在enabled之前的主存储器中的变量被错误的大小覆盖,也覆盖了它之后的所有内容。或者,你有一个覆盖它的迷路指针。

进一步调试此方法的唯一有用方法是在thkala中建议在gdb中添加一个观察点。