无法在调试器中重现错误

时间:2011-07-25 19:44:04

标签: c eclipse gdb

我正在研究C中的一个研究项目,在Windows上使用Eclipse和CDT,MinGW和GDB。

我有一个int数组,其元素应介于0和3(含)之间。我正在迭代数组并打开数字。我在我的默认情况下遇到了一个断言(0),以防我搞砸了某个地方并且我的界限之外的数字偷偷溜进来。现在,每当我运行程序时,这个断言就会进行某些输入。很好 - 我搞砸了某个地方,一个越界的数字正在偷偷摸摸。这是我可以处理的事情。问题是,当我在调试器中运行程序时,一切正常。断言从未触发,结果正确,并且没有问题。我不太关心错误的事实,而不是在调试时我无法重现错误的事实。

这是相关代码。 int * zeroPairs的每个%3 = 0元素(应该是)在0和3(包括)之间。接下来的两个元素是不同数组的索引,可以是各种数字。 j * 3不会超出zeroPairs的范围。数组A,B,C和D在每个索引中仅包含1或-1。当我有一个典型的A = temp,A = B等交换时,它工作正常。当我将其简化为只更改每个1上的符号时就是这个错误开始的时候。

感谢您的帮助!

for (j = 0; j < bits; ++j) {
        if (k & (1 << j)) { //Check if a bit is set, if so, swap the correct elements
            switch (zeroPairs[j * 3]) {
            case 0:
                A[zeroPairs[j * 3 + 1]] = -A[zeroPairs[j * 3 + 1]];
                A[zeroPairs[j * 3 + 2]] = -A[zeroPairs[j * 3 + 2]];
                break;
            case 1:
                B[zeroPairs[j * 3 + 1]] = -B[zeroPairs[j * 3 + 1]];
                B[zeroPairs[j * 3 + 2]] = -B[zeroPairs[j * 3 + 2]];
                break;
            case 2:
                C[zeroPairs[j * 3 + 1]] = -C[zeroPairs[j * 3 + 1]];
                C[zeroPairs[j * 3 + 2]] = -C[zeroPairs[j * 3 + 2]];
                break;
            case 3:
                D[zeroPairs[j * 3 + 1]] = -D[zeroPairs[j * 3 + 1]];
                D[zeroPairs[j * 3 + 2]] = -D[zeroPairs[j * 3 + 2]];
                break;
            default:
                printf("Whoops %d", zeroPairs[j * 3]);
                fflush(stdin);
                assert(0);
            }

        }
    }

1 个答案:

答案 0 :(得分:3)

调试版本通常“正确”工作,因为未初始化的变量设置为默认值。

此外,超出绑定的数组和指针访问通常不会导致覆盖其他变量,因为元素之间存在额外的填充。您在调试版本中仍然存在错误,但您可能没有意识到这一点。

相关问题