一个面试问题。关于调试

时间:2011-05-10 04:59:31

标签: debugging

我今天被问到这个问题。

调试时,出现错误。但是在添加一个printf()行之后。没错。 什么是错误可能导致这种情况。

这是一个悬而未决的问题。所以,让我说出我的想法。

那时我的答案不符合逻辑。 (例如,可能是一些内存错误?可能有并发问题?) 那么你可能会听到什么。

有些人可能会说这不是一个好的或不是一个合理的问题。但是当我们处理面试时,我们别无选择。我们需要说出什么是合乎逻辑的,并使它成为发明。 :)

3 个答案:

答案 0 :(得分:5)

并发问题非常有效。与其他操作相比,printf等I / O操作需要非常长,这有时会隐藏竞争条件(问题不会消失,只是表现得更少 - 更难调试)。

想象一下有人想出了这个有缺陷的想法:

  • 开始一个主题
  • 初始化将由该线程读取的一些内存位置

此时无法确定会发生什么。如果线程启动非常快,它将在启动线程有机会写入之前读取内存位置。但是,如果新线程只是在读取变量之前打印“哦干草,我是一个新线程”,它有很好的机会读取有效结果。当然,在1/10的情况下,失败,调试将是一件痛苦的事。

答案 1 :(得分:3)

他正在寻找的触发词是“heisenbug” - 一个在尝试研究时会消失的错误。

我会列出三个常见的错误,这些错误可能会导致这种错误:

  1. printf-statements副作用。在最简单的情况下,像printf("%d", i++);。在这种情况下,代码总是与语句一起工作,永远不会
  2. 如前所述 - 线程之间的竞争条件printf引入了轻微的延迟,降低了错误出现的可能性。但是,即使没有声明,该错误仍可能出现。
  3. 内存损坏 - 堆栈或堆在前一点被错误的指针代码破坏。对printf的调用揭示了这一点并导致崩溃。同样在这种情况下,即使没有声明,程序也可能会在以后崩溃。

答案 2 :(得分:0)

以下是我的猜测:

printf()正在修改某个变量;说一个论点是++i

printf()是一个i / o操作,需要相当长的时间来执行其他非i / o操作。也许它阻止了一些竞争条件。

printf()会返回一些值。也许该函数有int返回类型但没有return语句,所以在程序集中(至少这发生在gcc,x86-64中),返回最后返回的值。