151-5197-5087
扬州华为授权服务中心
当前位置:网站首页 > 网络设备调试 正文 网络设备调试

随想005:调试的思考

2024-12-05 23:11:15 网络设备调试 30 ℃ 0 评论

许多书都有介绍 调试模式,比如《电子电器工程师必知必会》、《调试九法:软硬件错误的排查之道》、《程序员修炼之道》,还有单看书名会很意外的《禅与摩托车维修艺术》。这些方法总结起来,就四个步骤:

  1. 重现 BUG
  2. 观察现象
  3. 提出假设
  4. 验证假设

任何的 BUG ,都可以通过这些步骤来解决!它就像一个巨大的推土机。虽然可能行动缓慢、工作起来枯燥乏味,但一路上无论遇到什么障碍,它都能铲平。让我来分别解释一下。


1. 重现 BUG


很多 BUG 很难解决,主要难在重现 BUG
总有人试图走些捷径,选择跳过这一步。无一例外,他们都会失败。
无源之水、无本之木、万丈高楼浮空起。结果自然是反反复复、来来回回,“攻关”之后接着“攻关”,然后公关。

  • 重现 BUG,才可以 观察现象
  • 重现 BUG ,才能判断 BUG 是否已经修复好,而不是暂时不出现了。

所以第一条经验法则是:

当你发现一个 BUG 时应该怎么办?
让它再次发生!

你可能有不同的观点:
你站着说话不腰疼,你有没有见过复杂系统、恶劣现场、间歇性 BUG ?
我知道,我见过。

你说这个 BUG 有个性,在家一切好好的,一到现场才出现
那就收拾好仪器,搭车、坐船、乘飞机,去现场

你说这个 BUG 很调皮,你想见它它不见,刚刚离去它出现
那就做好监控、日志,打持久战

你说这个 BUG 是库函数/客户电脑/编译器/之前就有…
你总是有那么多理由,就是对解决 BUG 没有丝毫帮助

我见过很多个在家想破头,现场仪器/调试器一架,秒解 BUG 的例子
我见过有人死磕半个月,解决一个复杂 BUG 的例子
我还见过有人用 1 年多的时间跟踪,解决一个偶发 BUG 的例子

我们心里都知道,BUG 不会凭空消失,它会持续存在,直到彻底解决。所以拿出技术人员该有的态度,遵循一个朴素的道理:

BUG 一定有原因,也一定能够找到它。


2. 观察现象


观察现象 是为了获得足够的细节,为 提出假设 提供依据。

你又说轻飘飘的废话了!什么样的现象算是细节?多少细节才算足够多?
第一个问题我真回答不了,就我不严谨的观察结果而言,有的人明摆着的错误就是视而不见。而有的人在茫茫多的数据中一眼就能看出问题所在。

不信?
有人调试硬件挠断头,说电源都正常,程序烧不进,有人看了一眼,说你的单片机焊错了,整体偏了180°。
有人调试程序挠断头,说程序能烧写进去,就是好像不运行,有人看了一眼,说你的主晶振和时钟晶振位置调换了。
有人破解通讯挠断头,说都测试了一千多条数据了也看不出规律,有人多看了几眼,给出了一个256个字符组成的密码表外加一个加密计算公式。

判断出哪些是细节,哪些需要关注,我很不情愿的认为这需要经验和天赋。

但另一个问题有着确定的答案,多少细节才算足够多?多到把 BUG 的原因锁定在几种可能范围内

为了实现这个目标,得有观察手段。
有人家里那个占地一百亩的超级密室,进了个贼,请你给抓出来
你过去一看,图纸工具都没有,密室里面还漆黑一片,抓你x的贼啊

首先要有 观察手段。也就是在程序设计的最开始,就考虑程序的 显见性 。优先编写能监视和显示内部状态的代码,用这些代码来充当我们的耳朵和眼睛,帮助我们回答那里有什么?发生了什么?

有人说现场有个问题,重启了你的设备后就消失了。
你连到设备后台,敲个命令返回了设备的历史启动信息,信息清楚的表明设备已经一年没有重启过了,显然问题消失跟重启毫无关系。

有人说把接在你设备上的 1# 传感器拔掉了,你的设备还是显示这个传感器在线。
你连接到设备后台,敲个命令返回了这个传感器的实时信息,信息清楚的表明,当前 1# 地址上一定有个传感器存在。你说 1# 地址上有传感器存在,他说我已经拔掉了;你说除了你拔掉的那个,还有一个 1# 传感器。他不说话了,去顺着线排查了。

其次得有工具,好歹给个手电筒。

有人说我的设备通讯老是短时故障
去搬台示波器查查波形。

有人说我的 I2C 设备读回来的都是 FF
去找个逻辑分析仪看看时序。

新手容易犯的一个错误,是接到 BUG 反馈后,凭空猜想原因。这是不可取的,凭空猜想,可能原因千万条,实际一看,猜了千万条都没中个奖。所以在观察到现象之前,让我们记住第二条经验法则:

不要想,而要看

那么,在查找问题时,我们首先应该观察哪些现象呢?仔细观察那些能帮助你缩小问题范围的细节。具体来说,观察那些能让你确定问题出在你的设备上还是其他设备上、是软件故障还是硬件故障、是隔离前的问题还是隔离后的问题…不错,正是二分法。每次观察后,如果都能排除一半的可能,就算一个问题有 10000 种可能,最多只需要 14 次观察,就能准确地定位问题。当然实际问题可没有这么简单,但运用二分法的思想,前几次观察必定可以帮助你迅速地缩小问题范围。


3. 提出假设


在观察到现象并获取第一手信息后,你可以基于这些信息提出假设,推测可能导致 BUG 的原因。

这是个技术活

不能凭喜好提,不能盲目自信的提,不能漫天撒网的提。你所提出的每一个假设,都得有所依据,这就意味着你需要具备一定的知识储备。换句话说,你得理解系统的运行原理!让我用一个具体例子解释这一点。

你观察到一个奇怪现象:同一批次的 IP 广播,有些接到思科交换机时可以正常通讯,而接到华为交换机时却无法通讯。同时,剩余的 IP 广播可以在这两台交换机上正常通讯。通过测试,你已经验证思科和华为的交换机都没有问题。如果让你假设是什么原因导致了问题,你能提出合理的假设吗?

为了提出合理的假设,你得知道网络基本知识、知道 IP 广播的 MAC 地址是自定义的、知道有可能将 MAC 地址错误地定义成多播地址、知道某些品牌的交换机会过滤掉多播地址的数据包。

所以当他们测试了 3 天都无法找到问题时,我根据他们的描述,凭借对这些知识的理解,只假设了一次,就定位出了问题。这就是理解系统的好处。

问题常常出现在你不曾触碰的地方。比如有不少 BUG,它们可以稳定重现,但就是难以解决。往往是因为这些 BUG 所涉及的知识,超出了自己能理解的范围。面对这种 BUG ,很多人甚至觉得矛盾:错误就在眼前重现着,可内心却有一种声音在呐喊:这不可能

没有什么是不可能的,如果有,那请记住第三条经验法则:

有时候觉得离奇,只是因为眼界不够

你觉得不可能,只是因为没有理解系统的运行原理。

要增加理解力,你需要查一查文献、读一读数据手册、做一做计算、问一问这个领域的好手。调试的过程,本就是经验和知识双增长的过程。

我已经举了一个理解系统带来好处的例子,我想再举一个不理解系统让人好笑的例子,这发生在我三岁半的儿子身上。

有一天晚上,他已经睡着,我倚在床边看东西,我俩第一次遇到了地震。他被地震晃醒了,猛地坐起来四下看了几眼,然后又躺下继续睡。第二天我问他你坐起来看什么呢,他说:

“(发现)床在晃,我坐起来看,没有人摇晃床,我(就又)睡觉了。”

三四岁的小孩子,是没有地震这个概念的。在他的认知里,床摇晃,那必然是有人在晃它。如果看不到这个人,他就会很困惑。这就是理解系统为什么重要的原因,不理解系统,提出的假设可能会偏离事实,甚至完全错误。


4. 验证假设


因为这一步的重要性,我要在最开始就给出第 4 条经验法则:

不要相信自己的假设!

我如此的信奉这条法则,那自然是因为被打脸的足够多。无论是谆谆教导、耳提面命,还是吃过亏上过当、或者常常自省
我们还是一次又一次的做出毫无根据的假设看似合理的假设或者局限于自己现有知识和经验的假设。然后不负责任的给出结论,不要这样!

对于提出的每一个假设,用实验去证实或者证伪,然后记录下来

有太多的时候,人们会带着一种假设去思考,根本没有意识到这会导致错误的结论。

未被验证的假设,有害于排错


最后,让我用一个具体例子结束本篇文章。

我带着3岁半的儿子去户外活动。那是公园旁边一块很大的草地,草地的另外一端,离我们大约两三百米处是一座工地,工地上几辆工程车正在作业。

我指着工地的方向对儿子说:“看,前面有两辆挖掘机!”

儿子好像看不清,一边茫然的四下巡视,一边问:“爸爸,挖掘机在哪里?”

“顺着我手指的方向,你看不到挖掘机吗?”

儿子摇头,表示没有看到。

“估计是太远了,或许走近些就能看到了”,我心里想着。

我看过一些育儿知识,知道 3 岁左右的小孩子的眼睛还远没有完全发育。然后我们边玩边向工地的方向靠近。离工地还有一百多米的地方,工程车清晰可见。我再次指给儿子看挖掘机,儿子仍表示看不到。

“完蛋了,眼睛有问题啊”

我看到他鼻尖渗出汗来,知道他跑热了,于是蹲下来把他衣服的拉链拉开一些。随后我扭头朝工地的方向看了一眼,这次,我也没能看到工程车,甚至连工地都看不到。

映入眼前的,是一个小土坡。一个很缓很矮的小土坡,在我蹲下时,挡住了工地。我站了起来,再次看到了工地,也首次注意到了那个小土坡。我把儿子抱起来,把工地指给他看,他立刻雀跃起来:“有两辆工程车,一辆绿色一辆蓝色,还有翻斗车和混凝土车。。。”

看不到工程车,原来不是发育问题、不是眼疾问题,而是身高的问题。


2024 年 5 月,再补充一个例子。

昨天晚饭后,我陪着 6 岁的儿子在楼下骑自行车,他看到一位遛狗的阿姨时,好奇地问我:
“爸爸,为什么养狗的人那么多,养猫的人很少呢?”

我问他是怎么得出这个结论的。他解释说,出来玩的时候经常看到有人带着狗玩,但是他长这么大只见过大姨家的泡芙(猫的名字)这一只宠物猫。所以他通过观察得出了养狗的人远远多于养猫的人这种结论。

实际上,我查过相关的数据。根据《2021年中国宠物行业白皮书》,截至2021年年末,养宠人群中养猫人群数占比59.5%,养狗人群数占比51.7%,这意味着,实际上养猫的人数是超过养狗的人数的。

我只好笑着向他解释:“你的观察很有心,但有时候,我们看到的情况并不一定完全准确,只是冰山一角。就像你刚刚说的,你可能经常看到有人带着狗狗在楼下玩,但其实,养猫的人也是很多的。”

“那为什么除了泡芙,我看到的其它猫都是野猫呢?”儿子好奇地问。

“这是因为狗狗需要每天出去散步,所以你在外边更容易见到它们。而猫咪呢,它们比较宅,大多数时间喜欢待在家里,特别是城市里的宠物猫,很多主人并不会经常带它们外出。就像大姨家的泡芙,它可能更愿意躺在窗台上晒太阳,而不是出去散步。”

“还有啊,”我继续说道,“猫咪比较独立,它们能自己在家待很久,不需要太多人陪。狗狗则更需要人类的陪伴和外出活动,所以狗狗主人带它们出门的频率更高,这也是为什么你会经常见到遛狗的人。

我不确定他能不能听懂。但在解决问题的过程中,我们大人自己也常常因为观察不全面,得出错误的结论,并陷入其中而不自知。






读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)

版权说明:如非注明,本站文章均为 扬州驻场服务-网络设备调试-监控维修-南京泽同信息科技有限公司 原创,转载请注明出处和附带本文链接

请在这里放置你的在线分享代码
«    2024年12月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
    网站收藏
    友情链接