在接受采访时我曾被问到以下问题,而且我仍然不清楚答案。我想知道是否有人知道我可以在哪里学到更多东西,谷歌搜索没有多大帮助:
假设您有一个您想要测试的程序。你添加一个日志语句突然,产生预期输出的程序停止产生预期的输出。可能发生了什么?
答案 0 :(得分:3)
啊哈。我实际上已经发生了这种情况。
让我们考虑一个程序,它有一个错误堆栈的错误。如果引入日志或打印语句,对日志的调用可能会使堆栈移位足以导致其改变行为。
思考如何展示一个例子是一个有趣的问题。可能最简单的方法是在printf中使用错误的格式...
好的,大概至少一个例子看起来像这样。
int parent(){ ... printf("%s\n", itoa(child()));
int child(){
int num;
scanf("%d%d", num); /* notice the format; scanf is going to eat more of the
* stack than it should.
*/
return num; /* but this return may unwind the stack successfully. */
}
如果您在返回前插入printf()
,就会发生这种情况。
答案 1 :(得分:2)
您的程序可能在并发线程之间存在竞争条件,因此对时序的任何更改都可能会改变程序行为。
通常这是另一种方式,这更糟糕(所谓的 Heisenbug ):你的程序行为不端,你想通过添加日志输出来调试它。但是日志输出会使问题消失,因此诊断变得非常困难。