调试语句有什么方法可以修复"一个程序中的错误?

时间:2014-11-10 19:16:48

标签: theory

在最近的一次采访中,我被问到以下问题:

  
    

你的程序中有一个错误,在尝试通过插入printf,console.log,System.out.println,echo等语句来调试它之后,错误消失了。怎么会发生这种情况?

  

我的答案如下:

  • 您在print语句中有副作用,例如:System.out.println(foo.somethingWithSideEffects())
  • 添加printf会更改程序的内存布局,因此可以覆盖相邻内存并防止崩溃
  • 本机代码中的未定义行为(如未初始化的值,缓冲区溢出,序列点等)

面试官说这些不是唯一可能发生这种情况的方法,我想不出任何其他方式只需添加printf等就可以“修复”程序中的错误。

还有什么其他因素可能导致这种情况发生?

2 个答案:

答案 0 :(得分:5)

最令人想到的是,调试代码可以改变代码的时间,如果正在调试的代码中存在竞争条件,这可能很重要。尝试调试在这样检查时消失的竞争条件可能会非常令人沮丧。

答案 1 :(得分:0)

由于内存溢出可能会发生这种情况,或者在程序运行时可能会出现系统中断。如果您无法真正附加调试,那么您可能会编写事件日志但它应该是我认为的最后一种方式