我曾经在一次采访中被问到以下问题,但我一直没有很清楚答案。我想知道是否有人知道我可以在哪里了解更多信息,谷歌搜索并没有太大帮助:
假设您有一个想要测试的程序。您添加了一条日志语句,突然间,产生预期输出的程序停止产生预期输出。可能发生了什么?
我曾经在一次采访中被问到以下问题,但我一直没有很清楚答案。我想知道是否有人知道我可以在哪里了解更多信息,谷歌搜索并没有太大帮助:
假设您有一个想要测试的程序。您添加了一条日志语句,突然间,产生预期输出的程序停止产生预期输出。可能发生了什么?
啊哈。我真的遇到过这种情况。
让我们考虑一个程序,它有一个正在修改堆栈的错误。如果您引入日志或打印语句,则对日志的调用可能会移动堆栈以使其改变行为。
思考如何展示一个例子是一个有趣的问题。在 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()
在返回之前插入 a,您的情况就会发生。
您的程序可能在并发线程之间存在竞争条件,因此对时间的任何更改都可能改变程序行为。
通常情况相反,情况更糟(所谓的Heisenbug):您的程序行为不端,您想通过添加日志输出来调试它。但是日志输出使问题消失了,因此变得非常难以诊断。