微信号:zte-wxcop

介绍:WXCOP(无限靠谱)研发实践社区——聚焦互联网时代可持续快速交付价值能力提升; 知识交流与传播,社区活动信息发布的平台

调试九法-攻城狮的九精白骨掌

2016-01-27 17:21 杨凯球
点击上方 “WXCOP” 可以订阅哦!
本文简介
调试九法是David J.Agans总结一种软硬件故障定位排查时通用的思路流程。本文针对此方法的九条规则进行解读阐述,希望能给攻城狮同学们在平时的故障定位排查过程中带来一定的启发和收获。

总体介绍
David J.Agans在《调试九法:软硬件错误的排查之道》一书中归纳了以下九条规则:
规则1:理解系统
规则2:制造失败
规则3:不要想,而要看
规则4:分而治之
规则5:一次只改一个地方
规则6:保持审计跟踪
规则7:检查插头
规则8:获得全新观点
规则9:如果你不修复bug,它将依然存在
这九条规则都是显而易见的,但如何把它们应用于特定的问题就不总是那么容易了,关键是记住并运用这些规则。下面我们对于这九条规则进行具体详细的解读讨论。

1 理解系统
详细解读
孙子兵法说:知己知彼,百战不殆。对于故障定位,理解系统就是这个意思,只有深入的了解系统的架构和工作原理,你才能更好的进行定位。
 
理解系统的一种重要方式就是阅读手册,手册是系统设计和开发时的重要输出和原则,通过手册你可以详细深入的了解系统,帮忙你判断系统是否正常。
 
对于理解系统, 除了阅读手册本身,我们还有很多其它的方法,譬如阅读相关设计方案、走查产品代码、直接使用软件等等方式,都是帮助你更好的理解系统的方法。
 
对于调试定位, 除了理解产品本身,你还需要了解你的定位工具,要知道不同工具的特定和不足,选择合适的工具可以帮忙你更快更好的进行问题定位。
 
这个 系统的范围不局限于你所关注的这个软件,也包括配套工具的理解,甚至像通讯产品,除了产品本身,甚至还要涵盖产品在整个通讯网络里面所处的位置,你不仅要了解产品本身,还要了解整个通讯网络系统。
 
当你充分理解系统后,你的定位就会思路清晰。但是人可能所有细节都能记的很清楚,这时候必要查阅相关文档手册协议是非常重要的一件事情。在理解系统的基础上,我们需要学会快速的查阅手册帮忙进一步分析定位。
 
2 制造失败
详细解读
我们制造失败主要是出于这3个目的:一是观察错误,二是查找线索,三是确认是否已修复。所谓的制造失败,就是我们理解的故障复现,只有复现了,才能更深入细致的定位问题,才能后续修复之后进行针对性的验证。
 
故障往往是某种状态下产生,所以你必须仔细观察程序在运行时的状态,需要我们尝试着从某一个已知的特定状态重新开始执行步骤进行复现。
 
为了复现引发失败,重新开始执行步骤时有时候往往要执行很多步骤,这时候往往可以通过自动化方式来触发。有时候这种复现有可能需要整夜执行,达到一定的执行次数情况下触发,所以 在引发失败的时候必要的自动化还是需要的。举个例子,某个故障,需要在一定的会话数链接的情况下触发,这时候如果需要人工进行触发效率很低,一旦操作失败失误,有可能得重新开始。这时候必要的自动化将会非常有必要。
 
引发失败和模拟失败是有区别的,有一个故障定位,你分析时猜测是由某种原因引起的,从而尝试着进行模拟。如果你猜测失败机理,模拟往往不会成功。要么你的猜测是错误的;要么测试改变了条件,模拟的系统可以正确工作,或者更糟,发生新的错误,因而分散了你对正在查找的问题的注意力。查找现有的bug已经够我们忙的了,所以不要去模拟失败来影响干扰我们。
 
有些故障我们会发现很难复现,这时候需要观察每一个细节,仔细观察并进行记录,不停的去尝试每一处可能。改变能够改变的每一件事情,振动、摇晃、扭曲,直到再现失败。
 
不要盲目相信统计数据。当发生一个间歇性问题时,可以注意那些看起来与问题有关的操作模式,但不要被表明现象所误导。一般测试部门会提供一些操作步骤,但那些可能不是问题的关键,因为同样的操作顺序并没有产生预期的bug,有时候它们与问题的联系被隐藏在其他随机因素背后。
 
“那”是指什么?它是测试人员或工程师所认为的问题背后的失败机理。复现问题的时候不能受“那”的影响, 需要怀疑任何可以怀疑的地方,去尝试操作复现。譬如,以前我们遇到一个将“l”错误输入成“1”的情况,当我们提供给现场的指令是正确的“l”,而当现场操作人员执行的时候反馈执行错误,我们始终以为现场操作人员肯定会执行拷贝我们的操作指令进行操作,不可能自己去输入,但是,当我们查到最后的时候,操作人员确实手工自己去输入了,并且还敲错了l。
 
最后,我们不能丢掉任何有用的调试工具,当你某一天想到用的时候,你会发现它非常有用。
   
3 不要想,而要看
详细解读
所谓眼见为实(当然这个也不一定是对的,目前很多心理研究发现有一种叫做变化盲视的现象,当人聚焦某一处内容时,周围的一些变化会选择项的忽视掉,哈哈,好像跑题了^_^),这里的不要想而要看就是这个意思,强调就是要自己亲眼看到失败,并仔细观察失败时的各个细节之处。
 
有时候观察是非常困难的一件事情,所以 必要的一些插装打印是很有帮助的,你可以通过给软件增加一些打印函数,或者调整日志打印的级别来帮忙深入观察分析。
 
这里我们要介绍一下海森堡测不准原理^_^海森堡是量子物理学的开拓者之一。他致力于研究质量和体积极小的原子内的粒子,他发现你要么测量一个粒子的位置,要么测量它向哪个位置运动,但这二者当中有一个测量的越精确,另一个就越测不准。无法得到准确测量的原因是探针成为了系统的一部分。就是说,测试工具影响了被测系统。
 
测试工具或者给系统插装加打印这些方法都是有可能影响系统运行的,这个无法避免,海森堡测不准原理提醒我们在定位的时候在需要想办法减少这些辅助手段对于故障定位时的干扰影响。
 
这里谈到的不要想,而要看,强调的时候是自己亲自去观察,而实际定位的时候除了观察,必要基于观察到的细节进行分析猜测还是非常必要,有助于帮助你逐步缩小搜索的范围,知道确认问题所在。所以, 这个需要进行平衡,不能只看不想,也不能只想不看,需要综合运用,不能从一个极端走到另外一个极端
 
4 分而治之
详细解读
分而治之非常容易理解,就是我们所谓的二分法, 反复地把问题分为好的一半和坏的一半,来缩小搜索范围,然后进一步的研究有问题的一半
 
这里面会涉及到一些小技巧,有些故障定位是很难
通过人眼观察识别,这时候就需要一些辅助手段来方便查看。譬如我们要查看英文单词拼写错误时,可以使用office word工具,word自动有检索拼写合法的功能,我们可以通过它来辅助帮我们进行检查;譬如我们要进行日志查看的时候可以使用notepad++这样的工具,将某些关键日志进行高亮或者颜色显示区分等等。
 
另外,修复已知bug或者消除噪声干扰也是很有必要的,这样可以避免由于其它的因素影响我们的问题定位。
 
5 一次只改一个地方
详细解读
在核潜艇中,动力装置控制台前面有一个黄铜杆。当发生某种状况而启动警报时,工程师们必须双手抓住黄铜杆,并一直保持,直到看清所有仪表和指示器,明白发生了什么事情。这样做是为了帮助他们客服开始“修复”问题的冲动(急着按开关和打开阀门)。
 
故障定位的时候要时刻保持这种双手抓住黄铜杆的冷静,问题必须一个一个排查, 隔离关键因素影响,一点一点进行修复排查,并且与正常的情况进行比较,只有这样你才能不受其它因素影响,能够正确的定位到问题根因。
 
一次只改一个地方是一种严谨的科学实验方法,对于我们鼓掌排查定位非常重要,需要时刻牢记在心。
 
6 保持审计跟踪
详细解读
保持审计跟踪非常关键,在测试人员看来不重要的细节可能对于bug修复人员很重要。而在测试人员看来很明显的事情可能在修复者看来无关紧要。因此,你必须记录下每一件事情,不起眼的事情可能会很重要。
 
记录测试日志(Taking Notes)的能力对于测试人员很重要,对于问题定位和复现将会有很大的帮助

7 检查插头
详细解读
怀疑自己的假设, 永远不要相信自己的假设,特别是这些假设在一些无法解释的问题中是核心因素的时候。检查插头讲的就是这个道理,对一些基础性的问题要有怀疑精神,要从头开始检查。
 
昨天在排查一个环境问题的时候,发现网管和前台设备始终无法进行正常的交互查询,而在网管上执行查询链路状态的命令时,显示都是正常的,百思不得其解。一直在基于链路就是正常的情况下去排查,后来静下来重新梳理了一下,从头开始,使用操作系统的netstat命令查询链路端口是否建链,结果发现并没有建链,链路有时通时断的状态,再深挖发现网络里面有其它IP抢占了跟前台的链路建立。
 
排查的时候需要有不断的怀疑精神,怀疑任何值得怀疑的地方,必要的时候从头开始,包括测试的工具都需要去怀疑。
 
8 获得全新观点
详细解读
你可能会害怕寻求帮助,以为这是无能的表现,但是实际恰恰相反,这只是表面你基于修复bug。即使是专家也有犯错的时候,有时候当毫无进展的时候必要的求助别人,获取专业知识,跟人讨论交流是非常有帮助的。
 
无论你想要获得什么样的帮助, 在向别人描述问题的时候,一定要记住一件事:报告症状,而不要讲你的理论。因为你的理论起不到任何作用,还有可能误导别人进入你的思维模式中去。但是你可以将一些疑问可以的地方如实反馈,避免交流或者寻求帮助的时候有信息遗漏。
 
9 如果你不修复bug,它将依然存在
详细解读
现在你已经掌握了所有的排查方法,并且成功定位故障根因,那么接下来要做的就是将bug修复,并进行验证,确保bug被正确的修复。
 
有时候修复bug,不仅仅简单的对系统进行修复,还需要考虑对过程的修复。你解决了一个故障,但是这个故障在软件编码的时候很容易引入,这时候在实际的项目中,你除了要修正这个bug,还需要考虑我们的项目过程是否需要改进,譬如引入必要的编码规范、开发原则或者实施重构等等。
 
我们不能简单停留在修复一个bug的基础上,需要进一步预防避免更多类似的bug产生
 
总结
调试九法是非常通用和实用的总结,每种方法都不是孤立存在的,需要协同配合使用。它看起来很简单,但是需要掌握熟练运用不容易,需要你不断的练习和实践去摸索掌握!

点击本公众号菜单“ 干货戳这”阅读更多精彩文章!


 
WXCOP无限靠谱 更多文章 WXCOP:"Hello World!" 【搬新家,第一弹】什么是影响力? 【搬新家,第二弹】如果程序员的世界里没有条件判断语句 【最佳实践】如何通过新颖的敏捷回顾会 激发团队士气 “代码PK”,不服?来战!
猜您喜欢 网站性能扩展案例:每天30-50亿请求,300K QPS是如何炼成的 【案例分享】redis audit内存分析工具在redis cluster中的应用 【干货】Java程序员职业规划及面试总结,加强版!(上) 那些A/B测试教我们的App Store优化 Python深入学习