我今天被问到这个问题。
调试时,出现错误。但是在添加一个printf()行之后。没错。 什么是错误可能导致这种情况。
这是一个悬而未决的问题。所以,让我说出我的想法。
那时我的答案不符合逻辑。 (例如,可能是一些内存错误?可能有并发问题?) 那么你可能会听到什么。
有些人可能会说这不是一个好的或不是一个合理的问题。但是当我们处理面试时,我们别无选择。我们需要说出什么是合乎逻辑的,并使它成为发明。 :)
答案 0 :(得分:5)
并发问题非常有效。与其他操作相比,printf
等I / O操作需要非常长,这有时会隐藏竞争条件(问题不会消失,只是表现得更少 - 更难调试)。
想象一下有人想出了这个有缺陷的想法:
此时无法确定会发生什么。如果线程启动非常快,它将在启动线程有机会写入之前读取内存位置。但是,如果新线程只是在读取变量之前打印“哦干草,我是一个新线程”,它有很好的机会读取有效结果。当然,在1/10的情况下,将失败,调试将是一件痛苦的事。
答案 1 :(得分:3)
他正在寻找的触发词是“heisenbug” - 一个在尝试研究时会消失的错误。
我会列出三个常见的错误,这些错误可能会导致这种错误:
printf-statements
有副作用。在最简单的情况下,像printf("%d", i++);
。在这种情况下,代码总是与语句一起工作,永远不会。printf
引入了轻微的延迟,降低了错误出现的可能性。但是,即使没有声明,该错误仍可能出现。printf
的调用揭示了这一点并导致崩溃。同样在这种情况下,即使没有声明,程序也可能会在以后崩溃。答案 2 :(得分:0)
以下是我的猜测:
printf()
正在修改某个变量;说一个论点是++i
printf()
是一个i / o操作,需要相当长的时间来执行其他非i / o操作。也许它阻止了一些竞争条件。
printf()
会返回一些值。也许该函数有int
返回类型但没有return
语句,所以在程序集中(至少这发生在gcc,x86-64中),返回最后返回的值。