2011-01-12 60 views
0

好的,伙计们。我以前从来没有遇到过这种情况,它使头脑变得难以理解,并且不合逻辑。我有一个有点复杂的循环,我想尝试通过放置一些printf语句来查看是否一切正常。我使用printf查看中间产品,并验证答案是否正确。然后,当我将printf注释到中间产品时,答案是错误的。有没有人遇到过这个?这使我疯了,我看不出printfs如何改变答案.... X_x如果有帮助,我使用的是C/C++编译器。感谢您的任何建议..试图利用printfs时的神秘c调试问题

这里是一个片段...

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

这是一件好事,但是当我注释掉的第一行代码,它被证明是不正确巨大。 :(

+5

请给我们看看代码! – William 2011-01-12 00:46:31

回答

7

很可能你在代码中犯了一个错误,导致了未定义的行为,而“undef订为“暗示”它可能在某些情况下工作“。

为什么要插入printf使它工作?一些可能性:

它改变了你的程序的不同部分之间,或者你的程序和世界其他地方之间的时序关系。

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

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

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

(请注意,许多相同的考虑也真调试器下运行时 - 因此,术语“heisenbug”:只出现一个错误,当你不看它)

1

个人如果您使用的是IDE我会打印到stderr,而不是标准输出。

我想借此调试器的充分利用,以尝试解决您的问题。就像在Visual Studio 2010中,Eclipse或NetBeans中添加破发点,并通过代码行慢慢步骤。

0

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

0

也许,这是堆栈损坏,并且你的某个方式扩展堆栈或触发一个守卫页面或其他东西。但没有其他代码就很难说出任何内容。