随想005:调试的思考
Posted 研究是为了理解
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随想005:调试的思考相关的知识,希望对你有一定的参考价值。
任何的 BUG,都可以用以下步骤来解决:
- 重现 BUG
- 观察现象
- 提出假设
- 验证假设
重现 BUG
很多 BUG 很难解决,在第一步 重现 BUG
时就撞了个头破血流。
总有人试图走些捷径,选择跳过这一步。
无源之水、无本之木、万丈高楼浮空起
结果自然是反反复复、来来回回,“攻关”之后接着“攻关”,然后公关。
重现 BUG
,才可以 观察现象
;
重现 BUG
,才能判断 BUG 是否已经修复好
当你发现一个 BUG 时应该怎么办?
让它再次发生!
你站着说话不腰疼、你不知人间疾苦、你何不食肉糜
你有没有见过复杂系统、恶劣现场、间歇性 BUG ?
我知道,我见过
你说这个 BUG 有个性,在家一切好好的,一到现场才出现
那就收拾好仪器,搭车、坐船、乘飞机,去现场
你说这个 BUG 很调皮,你想见它它不见,刚刚离去它出现
那就做好监控、日志,打持久战
你说这个 BUG 是库函数/客户电脑/编译器/之前就有…
你总是有那么多理由,就是对解决 BUG 没有丝毫帮助
我见过很多个在家想破头,现场仪器/调试器一架,秒解 BUG 的例子
我见过有人死磕半个月,解决一个复杂 BUG 的例子
我还见过有人用 1 年多的时间跟踪,解决一个偶发 BUG 的例子
所以现在,让我们正视问题 ,拿出专业的态度,跟着念:
BUG 一定有原因,也一定能够找到它。
观察现象
观察现象
是为了获得足够的细节,为 提出假设
提供依据。
你又说轻飘飘的废话了!
什么样的现象算是细节?多少细节才算足够多?
第一个问题我真回答不了,就我不严谨的观察结果而言,有的人明摆着的错误就是视而不见。
而有的人在茫茫多的数据中一眼就能看出问题所在。
不信?
有人调试硬件挠断头,说电源都正常,程序烧不进,有人看了一眼,说你的单片机焊错了,整体偏了180°。
有人调试程序挠断头,说程序能烧写进去,就是好像不运行,有人看了一眼,说你的主晶振和时钟晶振位置调换了。
有人破解通讯挠断头,说都测试了一千多条数据了也看不出规律,有人多看了几眼,给出了一个256个字符组成的密码表外加一个加密计算公式。
判断出哪些是细节,哪些需要关注,我很不情愿的认为这需要经验和天赋。
但另一个问题有着确定的答案,多少细节才算足够多?多到把 BUG 的原因锁定在几种可能范围内。
为了实现这个目标,得有观察手段。
他说我家那个占地一百亩的超级密室,进了个贼,你给我抓来
你过去一看,图纸工具都没有,密室里面还漆黑一片,抓你x的贼啊
首先里面得有光,也就是可见性。
可见性,就是可以监控和显示内部状态。
他说现场有个问题,重启了你的设备就消失了。
你连到设备后台,敲个命令返回了设备的历史启动信息,信息清楚的表明设备已经一年没有重启过了,显然问题消失跟你的设备毫无关系。
他说把接在你设备上的 1# 传感器拔掉了,你的设备还是显示这个传感器在线。
你连接到设备后台,敲个命令返回了这个传感器的实时信息,信息清楚的表明,当前 1# 地址上一定有个传感器存在。你说 1# 地址上有传感器存在,他说我已经拔掉了;你说除了你拔掉的那个,还有一个 1# 传感器。他不说话了,去顺着线排查了。
其次得有工具,好歹给个手电筒
你说我的设备通讯老是短时故障
去搬台示波器查查波形。
你说我的 I2C 设备读回来的都是 FF
去找个逻辑分析仪看看时序。
凭空猜想,可能原因千万条,实际一看,猜了千万条都没中个奖。
提出假设
这是个技术活。
不能凭喜好提,不能盲目自信的提,不能漫天撒网的提
你所提出的每一个假设,都得有所依据,这要求你肚子里得有点知识
问题常常出现在你不曾触碰的地方。
棘手的 BUG,通常是因为 BUG 涉及的知识超出了你能理解的范围。
所以,提出假设,还不能局限于自己已知的领域
有人提出的假设接近事实或者就是事实,有人提出的假设让你误入歧途。
关键在于你有多理解系统
理解系统的工作原理,理解为什么这样设计。
我有个四岁多的儿子
半年前我们在床上睡觉的时候,我俩第一次遇到了地震,
他被地震晃醒了,坐起来四下看了一眼,又继续睡
第二天我问他经过,他说:
“我睡觉,(发现)床在动,我坐起来看,没有人摇晃床,我就又睡了。”
这就是为什么理解系统很重要的原因。不理解系统,就没有做出正确假设的认知。
为了能提出合理的假设,你需要读一读文献、做一些计算、问一问该领域的好手,期间可能还要做些测试。
提出假设的过程,其实是对该领域加深理解的过程,一个主动学习的过程。
验证假设
如果只允许说一条经验法则,我毫不犹豫选择:
不要相信自己的假设!
无论是谆谆教导、耳提面命,还是吃过亏上过当、或者常常自省
我们还是一次又一次的做出毫无根据的假设、看似合理的假设或者局限于自己现有知识和经验的假设
然后不负责任的给出结论,最后被狠狠打脸
对于提出的每一个假设,用实验去证实或者证伪,然后记录下来。
在寻找线索的过程中,把纸笔放在旁边会很有帮助。
我带着3岁半的儿子去户外活动。
那是公园旁边一块很大的草地,草地的另外一端,离我们大约两三百米处是一座工地,工地上几辆工程车正在作业。
我指着工地的方向对儿子说:“看,前面有两辆挖掘机!”
儿子好像看不清,一边茫然的四下巡视,一边问:
“爸爸,挖掘机在哪里?”
“顺着我手指的方向,你看不到挖掘机吗?”
儿子摇头,表示没有看到。
“估计是太远了,或许走近些就能看到了”,我心里想着。
然后我们边玩边向工地的方向靠近。
离工地还有一百多米的地方,工程车清晰可见。
我再次指给儿子看挖掘机,儿子仍表示看不到。
“完蛋了,眼睛有问题啊”
我看到他鼻尖渗出汗来,知道他跑热了,于是蹲下来把他衣服的拉链拉开一些。
随后我扭头朝工地的方向看了一眼
这次,我也没能看到工程车
映入眼前的,是一个小土坡。
一个很缓很矮的小土坡,在我蹲下时,挡住了工地。
我站了起来,再次看到了工地,也首次注意到了那个小土坡
我把儿子抱起来,把工地指给他看,他立刻雀跃起来:
“有两辆工程车,一辆绿色一辆蓝色,还有翻斗车和混凝土车。。。”
看不到工程车,原来不是眼睛的问题,而是身高的问题。
有时候觉得离奇,只是因为眼界不够。
读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)
以上是关于随想005:调试的思考的主要内容,如果未能解决你的问题,请参考以下文章