为什么log语句会改变程序的输出?

时间:2009-07-24 07:18:53

标签: logging printf-debugging

在接受采访时我曾被问到以下问题,而且我仍然不清楚答案。我想知道是否有人知道我可以在哪里学到更多东西,谷歌搜索没有多大帮助:

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

2 个答案:

答案 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 ):你的程序行为不端,你想通过添加日志输出来调试它。但是日志输出会使问题消失,因此诊断变得非常困难。