<读书笔记>软件调试之道 :问题的核心-诊断

声明:本文档的内容主要来源于书籍《软件调试修炼之道》作者Paul Butcher,属于读书笔记。

不要急于动手!

尽管可以利用各种工具和技术以及软件自身查找缺陷,但是你最重要的财富是你的智慧

  • 一种调试方法

提出假设->设计实验->假设不成立,重新开始

  • 采用不同类型的实验

进行几种不同类型的实验,但是每种实验必须有一个明确的目标。比如软件内部运行状态、软件的输入参数、本身编码逻辑。

  • 实验必须起到验证的作用

实验是一种达到目的手段,而不是目的的本身。可以通过实验用来证明或者推翻假设。

  • 一次只做一次修改

设计实验的规则之一,你每次只能做一个修改。此规则适用于任何修改,令人大跌眼镜的是,该规则经常被人忽略!虽然一次修改几个地方看起来省时间,实际上可能得到的只是无效的结果。不要再犯这种错误

  • 记录你所做过的调试

在长期调试时,由于做过多种实验,最后可能忘记自己做了哪些工作,并且在已经得到证明的问题上重复浪费时间,甚至进入死胡同。因此应该做调试记录,理想情况是每个实验都都消除一些可能原因,最终找到根本原因。

  • 不要忽略任何细节

凡是你不明白的都是潜在的缺陷,因此即使莫名其妙的现象,也往往对发现问题本身非常有价值。弄清楚意想不到的运行状况可以为你节省大量跟踪缺陷的时间。

相关策略

  • 插桩

留意海森堡定律,其本身不应该影响软件本身的运行,有充足的利用把插桩留到代码中,从而编写出自调试软件。

  • 分而治之

也就是二分法,这种方法可以排除很多错误的情况,提高效率,但是对减小工作量、提高效率,其并非唯一。

  • 利用源码控制工具

利用源码控制系统,可以进行有效的回归跟踪,它可以有效的告诉你哪个变化导致了这些问题。

  • 聚焦差异

问题是否只在特定环境下重现?是否在大量数据输入情况下重新?

  • 向他人学习

许多缺陷只存在于代码中,因此只有你和合作者才能解决它们。但有时其设计到特定的算法、库文件等,这种情况可能其他人已经遇到过同样的问题。

陷阱

下面这些是从实战中来之不易的经验教训

  • 你做的修改正确吗

如果修改没有起到任何效果,那么你并没有改到点子上。这个陷阱很容易掉进去,又让人摸不着头脑,唯一的防御措施是时刻提高警惕。

  • 验证假设

假设会带来盲点,要了解你正在做什么样的假设,以及何时对它进行严格的检验。

  • 多重原因

这种情况比较难,最富有成效的解决多原因缺陷的办法是对问题进行隔离,并找到一个方法来重现缺陷。另外一个方法是先找寻同一区域内其它明显的缺陷并处理。

  • 流沙

实证方法的基础是,可以一次一次的重现问题,并且每次获得相同的结果,但是如果没有了这种确定性,想取得改进就变得极为困难。如果自己遇到了这种问题,那就立即停下来,继续进行只会陷入更大的麻烦。此时的主要目标是准确的找到是什么在变化,以便你能控制它。

思维游戏

调试是艰苦的,有时简直苦不堪言,别灰心 ,我们都遇到过。这正是软件开发工作的 一部分,如果你遇到这种情况,下面的技巧会帮你解决这些问题。

  • 旁观调试方法

最有效的一个策略就是向人求助,人多力量大,问题可能很快得到解决。做过这项工作的人都知道,往往只要把问题再解释一遍的简单行为也能激发灵感。因此实在找不到人,对着橡皮鸭或者纸人都可以做。

  • 角色扮演

在解释和探讨问题时非常有用,特别是涉及到系统之间的数据交互时。

  • 换换脑筋

当自己变得沮丧或者超负荷时,休息一会,看问题的角度可能就大不相同。

  • 做些改变

当做实证实验陷入困境之中时,做一点改变是必要的,任何改变都可以,也需不会告诉你任何东西,但是有时会给你带来惊喜。

  • 福尔摩斯原则

当你排除了一切不可能,无论剩下的是什么,他也一定是真相!

  • 坚持

在绝望时,请记住总有一个办法能帮你解决问题,只要有足够的时间、付出足够的精力和决心,你一定会解决问题。

验证诊断

我们人类是多才多艺的,其中才能之一就是自欺欺人。考虑到这一点,花时间验证你的诊断是很值得的。

  • 向他人讲述你的诊断

他们可能会发现一个缺陷,即使是旁观者效应也能帮助你达到这样的效果。

  • 检查源码原始副本

从一个已知没有问题的版本重新验证你编程时的思考。

  • 多和他人讨论

假设你是错误的,知道你犯过什么错误了吗?

时间: 2024-08-04 22:23:09

<读书笔记>软件调试之道 :问题的核心-诊断的相关文章

&lt;读书笔记&gt;软件调试之道 :从大局看调试-理想的调试环境

声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! ----------------------------------------------------------------------------------------------------- 自动化测试 1.有效的自动化测试 明确说明测试结果是否通过 不需要安装.测试后也能够撤销对环境所做的任何修改 单击运行所有的测试 全面覆盖,做到足够解决完全覆盖是可能的 2. 自动化测试

&lt;读书笔记&gt;软件调试之道 :从大局看调试-零容忍策略

声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! -------------------------------------------------------------------------------------------- 缺陷优先 如何使缺陷修复与软件开发相结合? 如何估计缺陷修复花费的时间? 如何确保项目不会陷入<人月神话>中所描述的无数缺陷修复的焦油坑中呢? 缺陷优先 要采用早起缺陷修复原则,并且基于以下两

&lt;读书笔记&gt;软件调试之道 :问题的核心-修复后的反思

声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! -------------------------------------------------------------------------------------------------- 有时尽管修复设计的是一个孤立的代码区,但你还是需要大局观,在修复缺陷之后花时间反思一下! 一旦确定了错误的来源,就可以采取措施避免它再发生!有些情况下,只不过是告诉你未来在在这一方面要更加小心

&lt;读书笔记&gt;软件调试之道 :问题的核心-如何修复缺陷

声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! 修复缺陷 对于一个好的修复来说,不仅仅是让软件运行正确,还需要为将来奠定基础.一些列零散的未经仔细考虑的修改,都将是原本的简洁设计逐步消失. 好的修复必须同时实现以下目标: 修复问题 避免引入回归 维持或者提高代码的整体质量 -----------需要参考的规则如下---------- 1.清除障碍 确保一切从头开始,当你不舍得抛弃诊断阶段所做的修改时,利用源码控制系统. 需要对所做的修

&lt;读书笔记&gt;软件调试之道 :问题的核心-重现问题

声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记. 重现第一,提问第二 问题重现是实证过程的最强大武器,如果不能重现问题,你也无法证明修复了它 首先按照缺陷报告的描述的步骤来做, 抓住重点,包含三个控制因素 软件本身:确保你使用的软件版本和bug提交的版本一致,使用相同的编译工具和相同的编译参数. 软件运行环境:如果要与外界环境交互,则确保使用相同外部系统.比如测距仪,需要在同样的光照环境.温度和供电方式. 提供的输入:如果软件代码的运行和配置参数

&lt;读书笔记&gt;软件调试之道 :从大局看调试-发现代码存在问题

声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! ----------------------------------------------------------------------------------------------- 缺陷可以随时发生,从代码编写完毕到代码发布后的成年累月! 无论你开发什么样的软件,都需要创建一些流程,通过这些流程,可以告诉你软件哪里出了问题,并且应该如何修复! 1.缺陷管理系统 既有简单用途的,

&lt;读书笔记&gt;软件调试之道 :实证方法

有效调试不仅仅是排除缺陷,其包含如下几个步骤 弄明白软件为何运行错误 修复这个问题 避免破坏其它部分 保持或者提高代码的总体质量 确保同样的问题不在其它地方发生,也不会再次发生 构建实验.观察结果 依赖观察和经验,而不是理论和纯逻辑推理 阅读源码,推理软件的运行状况,通常效率低下而危险 要仔细的构建实验环境并观察软件的运行状况 需要澄清的几个问题 你知道发生了什么吗? 要明确知道到底发生了什么,什么情况下发生的. 不要完全依赖缺陷报告,缺陷报告本身的错误也不会少 如果没有缺陷报告,应该在了解整个

&lt;读书笔记&gt; 代码整洁之道

概述 1.本文档的内容主要来源于书籍<代码整洁之道>作者Robert C.Martin,属于读书笔记. 2.软件质量,不仅依赖于架构和项目管理,而且与代码质量紧密相关,本书提出一种,代码质量与整洁成正比的观点,并给出了一系列行之有效的整洁代码操作实践,只要遵循这些规则,就可以编写出整洁的代码,从而提升代码质量. 3.该书介绍的规则均来自于作者多年的实践经验,涵盖从命名到重构的多个编程方面,具有很好的学习和借鉴价值. 4.习艺要有二:知和行.你应当学习有关规则.模式和实践的知识,穷尽应知之事,并

LDD读书笔记_调试技术

先写一个个人比较喜欢的调试技巧. 1. menuconfig中打开CONFIG_DEBUG_KERNEL 2. objdump -d -S(大写) *.o > file 可以得到混合C和汇编的代码 或者 make *.lst 也能得到 3. addr2line -f -e vmlinux address(0xcxxxxxxxx) 能得到address对应的函数名和所在的文件中的行数 4. 根据OOPS信息, 查看R13(SP), R14(LR), R15(PC)寄存器的值, ARM架构 ?pri