Debugging 对于难以解决的bug,您的最佳实践是什么?
我有时会发现自己试图修复一个顽固的bug,但只是在一段时间后才发现一些非常明显的错误 这种情况发生在我身上,当我认为问题与某些事情有关,而我对其他可能出错的事情有点“盲目” 大多数情况下,晚上睡一觉是有帮助的,第二天早上我立刻发现了问题 过去发生在我身上的事情:Debugging 对于难以解决的bug,您的最佳实践是什么?,debugging,language-agnostic,Debugging,Language Agnostic,我有时会发现自己试图修复一个顽固的bug,但只是在一段时间后才发现一些非常明显的错误 这种情况发生在我身上,当我认为问题与某些事情有关,而我对其他可能出错的事情有点“盲目” 大多数情况下,晚上睡一觉是有帮助的,第二天早上我立刻发现了问题 过去发生在我身上的事情: 编辑没有任何效果的真实源文件的副本 不是专注于真正的问题,而是在真正的问题已经解决的时候尝试去解决一些问题 没有像我以前使用解释语言那样进行编译/构建 在调试过程中,您的“盲目”体验是什么?一件非常有用的事情是在专注和不沉迷之间找到一个
在调试过程中,您的“盲目”体验是什么?一件非常有用的事情是在专注和不沉迷之间找到一个很好的平衡
- 确保您可以在不受干扰的情况下处理该bug
- 但是如果你不能集中注意力,也要知道什么时候该休息一下
最后,与同事讨论这个问题,通常第二双眼睛和观点会产生奇迹。令人惊讶的是,有时仅仅解释问题已经有所帮助,即使听者什么也没说。这叫做。使用调试器逐行遍历代码。至少,这应该能准确地指出你不理解的事情正在发生的地方。如果您最初对错误的猜测失败,请停止猜测并使用调试器。使用编辑器设置断点 使用断点,您不必在调试时反复从代码的开头开始,这使逐步完成代码变得更容易
正如你所说,最好的办法往往是从问题中退一步。。也许要做一段时间的其他事情,或者只是散散步。很多次,我都在尝试修复一个不需要修复的bug。在许多情况下,用户只是想要某个特定的行为,而不管该行为是否有正当理由。我曾经遇到过这样的情况,我会花很多时间试图“修复”这个bug,结果却发现这个bug其实不是bug,或者不太适合修复。使用你的版本控制系统,回到错误出现之前,将代码与引入错误的第一个版本进行比较 使用二叉搜索树方法使过程更快
有人告诉我,有一个git命令或工具可以让这变得简单。在3D(例如游戏)渲染中,调试总是一场噩梦。有时会用到像素调试器,它会显示该像素在什么时候和什么时候被修改,从什么颜色修改到什么颜色。如果你的.Net项目在Mono上失败,调试就是一场噩梦。大多数时候都是关于Console.WriteLine的 有几个选择。你可以:
- 在linux机器上调试。mono有一个命令行调试器
- 在linux机器上运行代码,并使用一些远程调试插件从visual studio进行远程调试(我还没有成功)
- 在windows上,运行MS.Net运行时,但将其与mono类库链接。除了mscorelib之外,您也可以这样做,尽管它涉及到一些与.net framework设置有关的混乱,例如禁用.net程序集的强键检查
- 使用调试器,确保您知道“预期”行为是什么,找到“预期”行为不再发生的点
- 当您可以回滚到代码的工作版本并开始一点一点地添加更改时,源代码管理会有所帮助,直到您发现有一点破坏了功能
- 使用事件日志。我最近有一个bug,它在应用程序事件日志中记录了一个DllNotFound异常。那没有意义,因为文件在那里。我花了一些时间查看系统日志,其中还有一个关于缺少依赖项的错误。因此,请使用所有可用的日志。亲自将关键信息写入事件日志,并确保其按预期显示
- 使用google或stackoverflow进行搜索。大多数问题以前都是别人遇到过的,你可能会惊讶于有多少人有同样的问题
- 开始向stackoverflow写一个问题。对于我提出的每个问题,至少有一个或两个问题我没有回答,因为只要用书面形式正确地阐述问题,我就能找到解决方案
- 如果可能的话,创建一个小的“一次性”空项目,并尝试在那里复制问题。这可能有助于查明问题是由您的代码还是由项目的其他部分引起的
- 利用同事的帮助
- 如果可以的话,离开一会儿,或者至少尝试做些不同的事情。你的大脑会下意识地继续处理这个问题,并可能很快给出解决方案
- 如果没有帮助,请阅读文档和手册。(:-)