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

Dav*_* Xu 4 theory

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

你在你的程序中的错误,试图通过将如printf,执行console.log,的System.out.println,回声等语句进行调试后,该错误消失.怎么会发生这种情况?

我回答了以下答案:

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

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

还有什么可能导致这种情况发生?

Com*_*uid 5

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