【问题标题】:Why would a log statement change the output of a program?为什么日志语句会改变程序的输出?
【发布时间】:2009-07-24 07:18:52
【问题描述】:

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

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

【问题讨论】:

  • print("the counter is at " + i++) \\ lol lol lol

标签: logging printf-debugging


【解决方案1】:

啊哈。我确实遇到过这种情况。

让我们考虑一个程序,它有一个正在修改堆栈的错误。如果您引入日志或打印语句,则对日志的调用可能会移动堆栈以使其改变行为。

思考如何展示一个例子是一个有趣的问题。在 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(),您的情况就会发生。

【讨论】:

  • “挖掘堆栈”? Ming 不是动词,如果是的话,在这种情况下,我看不出它与中国的明朝有什么关系。
  • @Colin Minging 是英国俚语,意思是丑陋,所以我认为这是丑陋的 :-)
  • 可悲的是,迈克尔,这是一次很好的保存尝试,但我只是通过更正自己的错字而毁了。我正试图用“Minging the merciless”找到某个地方,但为时已晚......
  • 网络上 munging 的定义:* Mung 是计算机术语,意思是“进行重复的更改,这些更改单独可能是可逆的,但最终会导致无意的...... en.wikipedia.org/wiki/ Munging * Munge - 在计算中,术语 munge [mʌndʒ] 意味着通过字符替换创建一个强大、安全的密码。“Munge”有时被反缩为“修改直到不容易猜到”。... en.wikipedia.org/wiki/Munge
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2017-06-05
    • 1970-01-01
    相关资源
    最近更新 更多