Debugging 对于难以解决的bug,您的最佳实践是什么?

Debugging 对于难以解决的bug,您的最佳实践是什么?,debugging,language-agnostic,Debugging,Language Agnostic,我有时会发现自己试图修复一个顽固的bug,但只是在一段时间后才发现一些非常明显的错误 这种情况发生在我身上,当我认为问题与某些事情有关,而我对其他可能出错的事情有点“盲目” 大多数情况下,晚上睡一觉是有帮助的,第二天早上我立刻发现了问题 过去发生在我身上的事情: 编辑没有任何效果的真实源文件的副本 不是专注于真正的问题,而是在真正的问题已经解决的时候尝试去解决一些问题 没有像我以前使用解释语言那样进行编译/构建 在调试过程中,您的“盲目”体验是什么?一件非常有用的事情是在专注和不沉迷之间找到一个

我有时会发现自己试图修复一个顽固的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程序集的强键检查

    这个问题涵盖了很多相同的方面:

    我同意sleske的观点,但我要补充的一点是将工作单元分解为更小的单元。所以,如果它是一个方法中的bug,那么就制作更小的方法。它将清除战争的迷雾。

    如果您不想设置断点,请到处打印输出。调试时帮了我大忙。然后,当然,当你看到可变输出与你认为的完全不同时,就像光线穿透一样。

    别管它,打电话给你的同事重新审视这个问题。一次又一次,我发现这种方法可以在5分钟内解决问题,而你可能会损失一整天。

    • 使用调试器,确保您知道“预期”行为是什么,找到“预期”行为不再发生的点
    • 当您可以回滚到代码的工作版本并开始一点一点地添加更改时,源代码管理会有所帮助,直到您发现有一点破坏了功能
    • 使用事件日志。我最近有一个bug,它在应用程序事件日志中记录了一个DllNotFound异常。那没有意义,因为文件在那里。我花了一些时间查看系统日志,其中还有一个关于缺少依赖项的错误。因此,请使用所有可用的日志。亲自将关键信息写入事件日志,并确保其按预期显示
    • 使用google或stackoverflow进行搜索。大多数问题以前都是别人遇到过的,你可能会惊讶于有多少人有同样的问题
    • 开始向stackoverflow写一个问题。对于我提出的每个问题,至少有一个或两个问题我没有回答,因为只要用书面形式正确地阐述问题,我就能找到解决方案
    • 如果可能的话,创建一个小的“一次性”空项目,并尝试在那里复制问题。这可能有助于查明问题是由您的代码还是由项目的其他部分引起的
    • 利用同事的帮助
    • 如果可以的话,离开一会儿,或者至少尝试做些不同的事情。你的大脑会下意识地继续处理这个问题,并可能很快给出解决方案
    • 如果没有帮助,请阅读文档和手册。(:-)
    一个没有任何帮助的例子:有一次我因为DataGridView无法显示而变得粗鲁