Debugging 调试的标准方法
调试问题的标准方法是什么?这似乎是一个相当宽泛的问题,你们中的一些人回答说“这取决于问题”,但我认为我们中的许多人是凭直觉进行调试的,实际上还没有尝试过使用我们的流程。这就是为什么我们说“视情况而定” 最近我被迫说出我的流程,因为我和几个开发人员正在处理同一个问题,我们用完全不同的方式调试它。我想让他们明白我想做什么,反之亦然 经过一番思考后,我意识到我的调试方式实际上相当单调。我将首先尝试可靠地复制问题(尤其是在本地计算机上)。然后通过一系列的消除(我认为这是与问题相关的)尝试识别问题 其他人试图用完全不同的方式来做 所以,我只是想知道你们这些家伙到底做了些什么?如果你必须用文字形式化它,你会说你的调试过程是什么Debugging 调试的标准方法,debugging,standards,Debugging,Standards,调试问题的标准方法是什么?这似乎是一个相当宽泛的问题,你们中的一些人回答说“这取决于问题”,但我认为我们中的许多人是凭直觉进行调试的,实际上还没有尝试过使用我们的流程。这就是为什么我们说“视情况而定” 最近我被迫说出我的流程,因为我和几个开发人员正在处理同一个问题,我们用完全不同的方式调试它。我想让他们明白我想做什么,反之亦然 经过一番思考后,我意识到我的调试方式实际上相当单调。我将首先尝试可靠地复制问题(尤其是在本地计算机上)。然后通过一系列的消除(我认为这是与问题相关的)尝试识别问题 其他人
顺便说一句,我们仍然没有发现我们的问题=)当我遇到一个我无法弄清楚的bug时,我喜欢为这个问题建立一个模型。复制问题代码部分,并开始从中删除功能,一次一个。每次删除后,对代码运行单元测试。通过这个过程,您要么删除带有bug的特性(从而找到bug),要么将bug隔离到包含问题本质的核心代码段。一旦你弄清了问题的本质,解决起来就容易多了。我的方法根据我对手头系统的熟悉程度而有所不同。通常我会这样做:
我直觉更敏锐的朋友和同事告诉我,当他们看着我调试或让我帮他们解决问题时,我很迂腐 我也非常喜欢使用消除过程。排除变量极大地简化了调试任务。这通常是第一件应该做的事情 另一个真正有效的方法是,如果可能,回滚到上一个工作版本,然后重试。这可能是非常强大的,因为它为您提供了坚实的基础,使您能够更加小心地进行操作。这方面的一个变化是,让代码工作到一个点,使用更少的功能,而不是不使用更多的功能
当然,重要的是不要只是尝试。这会增加你的绝望,因为它永远不会起作用。我宁愿跑50次来收集关于这个bug的信息,也不愿疯狂地挥杆,希望它能起作用 我通常首先根据手头的信息形成一个假设。一旦这样做了,我会努力证明它是正确的。如果它被证明是错误的,我从一个不同的假设开始 通过这种方法,大多数多线程同步问题都可以很容易地得到解决
此外,您还需要很好地了解正在使用的调试器及其功能。我在Windows应用程序上工作,发现windbg在查找bug方面非常有帮助。将bug简化为最简单的形式通常可以更好地理解这个问题,并在必要时增加让他人参与的好处 设置一个快速复制场景,以便有效地利用您的时间来测试您选择的任何低磷症 创建工具以快速转储环境以进行比较 在日志记录处于最高级别时创建和复制错误 检查系统日志是否存在任何警报 查看文件日期和时间戳,以了解问题是否可能是最近引入的 在源存储库中查找相关模块中的最新活动 应用演绎推理并应用原则
愿意退后一步,从这个问题上休息一下。我从网上或一些我想不起来的书上选的(可能是编的或…) 调试101:
- 复制
- 逐渐缩小范围
- 避免调试器
- 一次只改变一件事
- 橡皮鸭调试
- 不要猜测
- 不要太快责怪工具
- 了解问题和解决方案
- 休息一下
- 考虑多种原因
- 监控你自己的错误注入习惯
- 尽早引入调试辅助工具
- 松耦合与信息隐藏
- 编写回归测试以防止再次发生
- 惰性跟踪语句
- 查阅第三方产品的日志文件
- 在web上搜索堆栈跟踪
- 以合约方式引进设计
- 一笔勾销
- 间歇性错误
- 爆炸局部性
- 介绍