<读书笔记>软件调试之道 :问题的核心-诊断
声明:本文档的内容主要来源于书籍《软件调试修炼之道》作者Paul Butcher,属于读书笔记。
不要急于动手!
尽管可以利用各种工具和技术以及软件自身查找缺陷,但是你最重要的财富是你的智慧
- 一种调试方法
提出假设->设计实验->假设不成立,重新开始
- 采用不同类型的实验
进行几种不同类型的实验,但是每种实验必须有一个明确的目标。比如软件内部运行状态、软件的输入参数、本身编码逻辑。
- 实验必须起到验证的作用
实验是一种达到目的手段,而不是目的的本身。可以通过实验用来证明或者推翻假设。
- 一次只做一次修改
设计实验的规则之一,你每次只能做一个修改。此规则适用于任何修改,令人大跌眼镜的是,该规则经常被人忽略!虽然一次修改几个地方看起来省时间,实际上可能得到的只是无效的结果。不要再犯这种错误
- 记录你所做过的调试
在长期调试时,由于做过多种实验,最后可能忘记自己做了哪些工作,并且在已经得到证明的问题上重复浪费时间,甚至进入死胡同。因此应该做调试记录,理想情况是每个实验都都消除一些可能原因,最终找到根本原因。
- 不要忽略任何细节
凡是你不明白的都是潜在的缺陷,因此即使莫名其妙的现象,也往往对发现问题本身非常有价值。弄清楚意想不到的运行状况可以为你节省大量跟踪缺陷的时间。
相关策略
- 插桩
留意海森堡定律,其本身不应该影响软件本身的运行,有充足的利用把插桩留到代码中,从而编写出自调试软件。
- 分而治之
也就是二分法,这种方法可以排除很多错误的情况,提高效率,但是对减小工作量、提高效率,其并非唯一。
- 利用源码控制工具
利用源码控制系统,可以进行有效的回归跟踪,它可以有效的告诉你哪个变化导致了这些问题。
- 聚焦差异
问题是否只在特定环境下重现?是否在大量数据输入情况下重新?
- 向他人学习
许多缺陷只存在于代码中,因此只有你和合作者才能解决它们。但有时其设计到特定的算法、库文件等,这种情况可能其他人已经遇到过同样的问题。
陷阱
下面这些是从实战中来之不易的经验教训
- 你做的修改正确吗
如果修改没有起到任何效果,那么你并没有改到点子上。这个陷阱很容易掉进去,又让人摸不着头脑,唯一的防御措施是时刻提高警惕。
- 验证假设
假设会带来盲点,要了解你正在做什么样的假设,以及何时对它进行严格的检验。
- 多重原因
这种情况比较难,最富有成效的解决多原因缺陷的办法是对问题进行隔离,并找到一个方法来重现缺陷。另外一个方法是先找寻同一区域内其它明显的缺陷并处理。
- 流沙
实证方法的基础是,可以一次一次的重现问题,并且每次获得相同的结果,但是如果没有了这种确定性,想取得改进就变得极为困难。如果自己遇到了这种问题,那就立即停下来,继续进行只会陷入更大的麻烦。此时的主要目标是准确的找到是什么在变化,以便你能控制它。
思维游戏
调试是艰苦的,有时简直苦不堪言,别灰心 ,我们都遇到过。这正是软件开发工作的 一部分,如果你遇到这种情况,下面的技巧会帮你解决这些问题。
- 旁观调试方法
最有效的一个策略就是向人求助,人多力量大,问题可能很快得到解决。做过这项工作的人都知道,往往只要把问题再解释一遍的简单行为也能激发灵感。因此实在找不到人,对着橡皮鸭或者纸人都可以做。
- 角色扮演
在解释和探讨问题时非常有用,特别是涉及到系统之间的数据交互时。
- 换换脑筋
当自己变得沮丧或者超负荷时,休息一会,看问题的角度可能就大不相同。
- 做些改变
当做实证实验陷入困境之中时,做一点改变是必要的,任何改变都可以,也需不会告诉你任何东西,但是有时会给你带来惊喜。
- 福尔摩斯原则
当你排除了一切不可能,无论剩下的是什么,他也一定是真相!
- 坚持
在绝望时,请记住总有一个办法能帮你解决问题,只要有足够的时间、付出足够的精力和决心,你一定会解决问题。
验证诊断
我们人类是多才多艺的,其中才能之一就是自欺欺人。考虑到这一点,花时间验证你的诊断是很值得的。
- 向他人讲述你的诊断
他们可能会发现一个缺陷,即使是旁观者效应也能帮助你达到这样的效果。
- 检查源码原始副本
从一个已知没有问题的版本重新验证你编程时的思考。
- 多和他人讨论
假设你是错误的,知道你犯过什么错误了吗?
<读书笔记>软件调试之道 :问题的核心-诊断的更多相关文章
- <读书笔记>软件调试之道 :从大局看调试-理想的调试环境
声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! ---------------------------------------- ...
- <读书笔记>软件调试之道 :从大局看调试-零容忍策略
声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! ---------------------------------------- ...
- <读书笔记>软件调试之道 :从大局看调试-发现代码存在问题
声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! ---------------------------------------- ...
- <读书笔记>软件调试之道 :问题的核心-修复后的反思
声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! ---------------------------------------- ...
- <读书笔记>软件调试之道 :问题的核心-如何修复缺陷
声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! 修复缺陷 对于一个好的修复来说,不仅仅是让软件运行正确,还需要为将来奠定基础.一 ...
- <读书笔记>软件调试之道 :问题的核心-重现问题
声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记. 重现第一,提问第二 问题重现是实证过程的最强大武器,如果不能重现问题,你也无法证明修复了它 ...
- <读书笔记>软件调试之道 :实证方法
有效调试不仅仅是排除缺陷,其包含如下几个步骤 弄明白软件为何运行错误 修复这个问题 避免破坏其它部分 保持或者提高代码的总体质量 确保同样的问题不在其它地方发生,也不会再次发生 构建实验.观察结果 依 ...
- 读书笔记|Windows 调试原理学习|持续更新
关于调试方面的学习笔记,主要来源于<软件调试>的读书笔记和梦织未来论坛的视频教程 1.调试器使用一个死循环监听调试信息. DebugActiveProcess(PID);while(TRU ...
- <读书笔记> 代码整洁之道
概述 1.本文档的内容主要来源于书籍<代码整洁之道>作者Robert C.Martin,属于读书笔记. 2.软件质量,不仅依赖于架构和项目管理,而且与代码质量紧密相关,本书提出一 ...
随机推荐
- 转载:Java的接口及实例
转自:http://blog.csdn.net/liujun13579/article/details/7736116/ 一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特 ...
- [Android] ADB操作相关经验
1.手机必须先root,小米可以安卓开发版系统即可.(注意:usb设置为调试模式) 2.安卓 adb工具(android debug bridge) 3.依次执行下面的命令: #adb root 获得 ...
- Building good docker images
The docker registry is bursting at the seams. At the time of this writing, a search for "node&q ...
- WebService 错误:无法加载协定为xxx的终结点配置部分,因为找到了该协定的多个终结点配置
当在vs 2008中添加服务引用后,如果“更新”服务引用,或“删除”该服务引用后再次加入后,在运行时会出现此错误.这是因为在“更新/删除”服务引用时,app.config文件并不会自动修改,在“更新” ...
- 自定义 Activity 的 标题栏 TitleBar
自定义 Activity 的 标题栏 TitleBar 1. 修改标题栏的高度,背景 编辑styles.xml,添加: <?xmlversion="1.0" encoding ...
- NAT 网络地址转换
NAT 网络地址转换(Network Address Translation) NAT(Network Address Translation,网络地址转换)是1994年提出的. 属接入广域网(WA ...
- WCF部署于IIS使用的几个问题总结
Q:wcf 远程服务器返回错误: (405) 不允许的方法. A: new SqlServerOperateClient("BasicHttpBinding_ISqlServerOperat ...
- [I2C]I2C总线协议图解
转自:http://blog.csdn.net/w89436838/article/details/38660631 1 I2C总线物理拓扑结构 I2C 总线在物理连接上非常简单,分别由S ...
- 清除系统日志及数据库(sql server)日志最佳实践
在一个项目中遇到的问题:系统日志过大,后来用delete语句删除了(相当的慢),结果数据库日志又变成很大了(差不多10G),所以又得把数据库日志删除. 方法: --备份系统中的部份日志--SELECT ...
- JS 继承总结
ES里面没有真正的继承,但是能通过某些手段达到继承效果,从而让一个类拥有另外一个类的方法 类 =>构造函数 继承描述某语言环境---魔兽世界 哈!其实我没玩过 魔兽世界里面 有Humen类 ...