调试的最佳实践

Bri*_*sen 10 .net c# debugging

我最近使用Visual Studio和WinDbg对托管应用程序进行了相当多的调试,因此我经常要求协助同事调试情况.有几次我发现人们只是在这里和那里插入断点并希望最好.根据我的经验,这很少是一种有用的技术.

我的方法就是这样的.

  • 重现问题.理想情况下尽可能减少输入.

  • 检查出了什么问题,并列出了可能出现错误的理论.

  • 通过调试代码的特定区域,一次检查一个理论.

根据需要重复步骤.

对于复杂的调试问题,我经常与同事一起工作.对于WinDbg,这特别有用.

调试的任何其他有用的提示或最佳实践?

Rob*_*lls 12

如果有一个提示我可以给每个人调试它将再次打破它.

也就是说,当你认为你已经找到修复程序并且系统似乎有效时.返回修复程序,查看系统是否再次中断.

有时您可能会迷失在您尝试作为潜在解决方案的序列中,并在调试问题时完成系统的完全不同区域.然后你会忘记你在原来工作区域改变了什么.

支持修复然后再现问题可确保候选修复不依赖于您在系统的其他部分中更改的其他内容.您的修补程序补丁是一个正确的独立解决方案.

HTH.

干杯,


ans*_*gri 11

一个非常好的做法是不要立即深入调试,而是查看代码并认真思考一段时间.


Jef*_*ger 8

我不知道我在哪里读到"橡皮鸭调试",但我认为它很棒.基本的想法是在桌面上设置橡皮鸭并向其解释代码.这个想法是,当你向鸭子解释代码时,你最终会发现自己说"现在,这种情况发生了",你会注意到"这个"并不是你想要发生的事情.

缺少一只鸭子,我发现我只是通过代码并向自己解释.它有效,但我仍然认为我可能带来一只鸭子.

[编辑]我发现我在哪里读到橡皮鸭橡皮鸭调试


Chr*_*isA 5

正如另一张海报所说,通过一些艰难的思考,如果您了解正在发生的事情,通常可能只看到逻辑错误.

但是我们常常认为我们这样做,而我们没有,或者我们只需要修理一些我们不太了解的东西,所以它又回到了第一原则.

重现问题无疑是至关重要的第一步.如果你不能这样做,那么除非意外,否则你没有机会找到问题.

下一步是毫无疑问地确定通过臭虫命中时实际执行的代码的路径.在可能包含许多事件和多个线程的WinForms应用程序中,这可能只是一个简单的练习.

在你确切知道代码的去向之前,世界上关于bug可能在哪里的所有理论都是毫无价值的.如果代码很复杂,那么发现代码不会在断点处停止可以像停止一样提供信息.

因此,根据我的经验,尽早使用断点通常可以成为发现代码工作方式的重要工具.

我经常发现当一个问题看起来特别棘手时,这是因为我对发生的事情做了致命的假设,并没有真正验证它.

所以我的'最佳实践'不是继续前进,直到我确定我理解,而不是猜测.


Jos*_*ris 5

与调试没有直接关系,但为了使以后的调试更容易,需要考虑以下几点:

  • 实施单元测试,最好是采用 TDD 的形式,迫使您专注于任务并仅以通过测试为目标进行开发。当您为测试而不是任务编码时,更难“徘徊”。
  • 养成定期重构代码的习惯。与整体式“万事通”方法相比,小型、点对点方法更容易调试。
  • 利用您的团队成员。通常添加一组额外的眼睛可以帮助冲洗掉一些东西。很有可能,如果您没有以相对较快的方式找到某些东西,您将继续忽略它一段时间。
  • 您始终可以回滚版本控制系统中的代码,以尝试隔离导致引入错误的文件版本。一旦你这样做了,你就可以区分最后一个好的和第一个坏的,只关注两者之间的变化。