-1

我曾经在一次采访中被问到以下问题,但我一直没有很清楚答案。我想知道是否有人知道我可以在哪里了解更多信息,谷歌搜索并没有太大帮助:

假设您有一个想要测试的程序。您添加了一条日志语句,突然间,产生预期输出的程序停止产生预期输出。可能发生了什么?

4

2 回答 2

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()在返回之前插入 a,您的情况就会发生。

于 2009-07-24T07:21:36.447 回答
2

您的程序可能在并发线程之间存在竞争条件,因此对时间的任何更改都可能改变程序行为。

通常情况相反,情况更糟(所谓的Heisenbug):您的程序行为不端,您想通过添加日志输出来调试它。但是日志输出使问题消失了,因此变得非常难以诊断。

于 2009-07-24T08:31:15.463 回答