尝试使用printfs时出现神秘的c调试问题

时间:2011-01-12 00:43:50

标签: c debugging printf

好的,伙计们。我以前从未遇到过这种情况,这让人难以置信,并且不合逻辑。我有一个有点复杂的循环,我想尝试通过放置一些printf语句来查看一切是否正常。我使用printf查看中间产品并验证答案是否正确。然后,当我将printf注释到中间产品时,答案是错误的。有没有人见过这个?这让我疯狂,我不知道printfs如何改变答案.... X_x如果有帮助,我正在使用c / c ++编译器来实现DSP。谢谢你的任何建议..

这是一个片段......

printf("splitBackground = %d, numWindowPoints = %d\n", splitBackground, numWindowPoints);
splitBackground = splitBackground/numWindowPoints;
printf("%d ", splitBackground);

这很好但是当我注释掉第一行代码时,结果却非常不正确。 :(

4 个答案:

答案 0 :(得分:7)

您很可能在代码中犯了一个导致未定义行为的错误。并且“未定义”意味着“它可能在某些情况下有效”。

为什么插入printf会使其有效?一些可能性:

它会改变程序不同部分之间或程序与世界其他地方之间的时序关系。

printf调用禁止可能发生的编译器优化。

printf调用以防止错误发生的方式更改标准库的内部状态。

printf调用以防止错误发生的方式与硬件交互。

(请注意,在调试器下运行时,许多相同的注意事项也是如此 - 因此术语“heisenbug”:只有在您不注意时才会出现的错误。)

答案 1 :(得分:1)

我个人会打印到stderr,而不是stdout。

如果您使用的是IDE,我会充分利用调试器来尝试解决您的问题。与Visual Studio 2010,Eclipse或Netbeans一样,添加断点并慢慢逐步执行代码行。

答案 2 :(得分:0)

你的printf可能有副作用(修改一些数据导致正确的结果)。在任何情况下,查看有问题的代码的简化示例将非常有帮助

答案 3 :(得分:0)

可能这是堆栈损坏,你的printf以某种方式扩展堆栈或触发一个防护页面或其他东西。但如果没有剩下的代码,很难说出来。