调试九法——软硬件错误的排查之道

1

理解系统

阅读手册。 它会告诉你在使用除草机时,要在除草头上涂润滑油,这样除草强就不会被炼化。
仔细阅读每个细节。 有关微处理器如何处理中断的详细信息就隐藏在数据手册 的第37页。
掌握基础知识。 电锯本来就是会发出很大的噪声。
了解工作流程。 引擎的转速可能与轮胎的转速不同,这是由转动轴造成的。
了解工具。 弄清楚体温计的哪一端才是用来测量体温的,弄清楚Glitch-O-Matic逻辑分析器的强大功能是如何使用的。
查阅细节。 连爱因斯坦都会去查阅细节,而Kneejerk却盲目相信自己的记忆力。

2

制造失败

什么也比不上直接取得的证据来的重要
我们之所有制造失败,是出于三个目的,一观察错误、二查找线索、三确认是否已修复。
虽然看起来很简单,但如果不制造失败的话,调试就会变得很困难。

制造失败 目的是为了观察它,找到原因,并检查是否已修复。
从头开始 修车工需要知道汽车车窗在被冻结之前你洗过车。
引发失败 用喷水管向漏雨的那扇窗喷水。
但不要模拟失败 用管子喷向漏雨的那扇窗,而不要向另一扇不同但看起来类似的窗户喷水。
**查找不受你控制的条件(正是它导致了间歇性失败)**改变能够改变 的每件事, 振动、摇晃、扭曲,直到再现失败。
记录每件事情,并找到间歇性bug的特征 我们的绑定系统总是只在呼叫 顺序错乱才失败
不要过于相信统计数据 绑定问题看起来与时间段有关,但实际上真正的原因是当时年轻人占用了电话线路。
要认识到“那”是可能会发生的 甚至冰淇淋的口味也会影响汽车的发动。
永远不要丢掉一个调试工具 自动击球板可能在某一天就会派上用场。

3

不要想,而要看

凭空想象,问题可能有几千条原因,而实际的原因只有去看了才能发现

观察失败
高级工程师看到了真实的问题,并且能够找到原因,而初级工程师认为他们知道错误发生在哪里,结果他们修复的地方根本没有出错
查看细节
听到水泵似乎发出声音时不要停下来,到地下室查明是哪个水泵
植入插装工具
使用源代码调试器、调试日志、状态消息、信号灯和臭鸡蛋的气味
添加外部插装工具
使用分析器、示波器、量表、金属检测仪、心电图仪和肥皂泡。
不要害怕深入研究
虽然它是软件成品,但它出问题了,你必须打开并修复它。
注意海森堡效应
不要让仪器影响了系统
猜测只是为了确定搜索的重点
大胆地猜测内存时序发生 了错误,介在修复之前应该先查看它。

4

分而治之

当bug的藏身之地被缩小一半时,它将很难再隐藏下去。

通过逐次逼近缩小搜索范围 猜测1-100内的一个数字,只需要7次。
确定范围 如果数字是135而你却认为它在1-100内,那么你必须扩大范围
确定你位于bug的哪一侧
如果你所在位置有排放物,则排放管就在上游。如果没有排放物,则排放管就在下游。
使用易于查看的测试模式 从干净、清澈的水开始,以便当排放物进入河流中时很容易看到它
从有问题的一端开始搜索 如果你验证的是正确的部分,那么你需要验证的地方太多了。应该从有问题的开始,然后身后追查原因。
修复已知bug。bug互相保护,互相隐藏 因此一旦找到,立即修复它们。
首先消除噪声干扰 注意那些导致系统问题的干扰因素。但对一些无足轻重的问题不要过于极端,也不要为了追求完美而去修改所有地方。

5

一次只改一个地方

我们在生活中要有一点先见之明。如果你所做的更改湖起到预期的作用,那么就把它改回来。它们可能会产生无法预料的影响。

隔离关键因素 如果你在检查日照时间的影响,就不要改变灌溉方案。
用双手抓住黄铜杆 如果你在不知道具体发生了什么问题的情况下就试图去修理核潜艇,可能会引发一次水下切尔诺贝利爆炸。
一次只改一个测试 我之所以知道我的VGA采集相应被破坏了,就是因为其它东西都没有发生改变
与正常情况进行比较 如果所有出错的情况都有一些特征,而这些特征是正常情况所没有的,那么你就找到了问题所在。
确定自从上一次正常工作以来你改变了什么地方 我的工友改变了唱机转盘上的唱头,因此这是一个很好的调试起点。

6

保持审计跟踪

不要只是在心里记住“保持审计跟踪”这条规则,而要把它写下来

把你的操作、操作的顺序和结果全部记录下来 你上一次喝咖啡是什么时候?你的头痛是从什么时候开始的?
要知道,任何细节都可能是重要的 视频压缩芯片的崩溃是由于格子衫造成的
把事件关联到一起 “它发出噪声,从21:04:52开始,持续5秒” 比仅仅说“它发出噪声”要好的多
用于设计的审计跟踪在测试中也非常有用 软件配置控制工具可以告诉你哪次修订引入了bug。
把事件记录下来 无论那个时刻多么恐怖,都要把它记到备忘录中,这样你才不会忘记。

7

检查插头

一些显而易见的假设往往是错误的。请恕我赘述,假设错误通常是最容易修复的错误。
质疑你的假设 是否运行了正确的代码?是不是燃气用完了?插头是否已挺好?
从头开始 是否正确地对内存进行了初始化?是否按除草机上的“primer bulb”按钮?开关是

8

获得全新观点

不管怎样,你都要休息一下,喝杯咖啡

征求别人的意见 甚至一个不说话的人体模特也能帮助你认识到你先前没有注意到的事情
获取专业知识 只有VGA视频采集卡的厂商才能够肯定相位功能发生了错误
听取别人的经验 别人会告诉你国内顶灯的线被挤压出来了
帮助远处不在 同事、供应商、网络、还有书店,都在等等着为你提供帮助
放下面子 bug发生了。以除掉bug为自豪,而不要非得以自己除掉bug才自豪
报告症状,而不要讲你的理论 不要把别人拖进你的思维定式中
你提出的问题不必十分肯定 你提出的问题不必十分肯定。甚至连“穿了格子衬衫”这样的事情也可以提出来。

9

如果你不修复bug,它将依然存在

现在你已经掌握了所有的技术,没有理由再让bug存在了

查证问题确实已被修复 不要假设是电路的问题,而仍然让汽车带脏的滤油嘴上路
查证确实是你的修复措施解决了问题 口中大喊 “Wubba!” 并不是使计算机打开的窍门
要知道,bug从来不会自己消失 使用最初导致它失败的方法再制造失败。如果必须交付产品,那么就在产品设计一个用捕捉bug
从根本上解决问题 在烧坏另一台变压器之前,先把无用的9音轨磁带卡座扔掉
对过程进行修复 不要只是擦掉地上的油,而要纠正设计机器的方式

从帮助台得到的观点是不明确的

只能通过远程方式了解问题,眼睛和耳朵接收到的信息并不十分准确,而且关键是时间紧迫

遵循规则 无论用户多么糊涂,都必须找到应用规则的途径
对行动和结果加以确认 用户会误解你的意思,同时会犯错误。通过确认他们所说和所做的一切可以及早发现这些问题
使用自动工具 不要让用户参与系统生成的日志和远程监控与控制工具
即使是最简单的假设也需要确认 是的,有些人就是不知道有电才能使用字处理器
使用可用的故障检修指南 要处理的很可能就是已知的、好的设计。不要忽略历史
帮助完善故障检修指南 如果找到了某个已知系统的一个新问题,将解决问题的所有内容进行归档可以帮助下一位技术人员。

小结

“黄金”规则意味着以下几条特点

通用 你可以将它们应用于任何系统上的任意调试场景
基础 它们为适用于你的系统的特定工具与技术提供了框架,并对这些工具技术的选择起到指导作用
至关重要 如果不遵循所有这些规则,就无法有效地进行调试
容易记忆 我们一直在提醒你调试规则

理解系统
制造失败
不要想,而要看
分而治之
一次只改一个地方
保持审计跟踪
检查插头
获得全新观点
如果不修复bug,它将依然存在

要做工程师B,并遵循以上规则。将臭虫(bug)牢牢钉住,成为英雄。早点回家睡个好觉,或者早点开始舞会。这是你应得的奖赏

详情查看书籍
下载地址: 网盘链接
提取码: 9bj2

摘抄自:《调试九法——软硬件错误的排查之道》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值