经常有朋友问我,该如何调试程序的偶发性问题?
大家所谓的偶发性问题,就是很难复现、较难定位的问题,比如在家里验证了N遍,固件一发布到客户现场就各种宕机;现场刚调试得明明白白,正准备离开客户公司大门,客户来电话了,然而折返复现问题,却死活不出现;明明有些代码“对天发誓”不会存在问题,而程序运行久了总有概率在那一块翻车,等等。
确实遇到这样的问题属实让人头皮发麻,比如你在深圳,客户现场在北京,出了一些偶发性问题,很多朋友心里想要是能飞过去插个仿真器那这些bug不是分分钟的事情吗?其实也不是不可能,远程仿真工具嘛~最怕客户现场没有网络~
不过问题是有些bug不是随随便便给你面子复现的,甚至它隔个好几天问候一下你,总不能可能一直干等吧。
那么,对于这样的偶发性问题,我们到底该如何解决呢?
1
知己知彼
首先我们要充分的了解和把握出现问题的情景,比如问题出现时,是否客户做了什么操作、是否有停过电、大概在几点出现的、是否存在一定的规律、如果现场有多台机器,他们是否都会出现类似的问题等等。
只有充分了解了问题现场的详细发生情景,你才能快速的排除一些问题、缩小定位的范围,最重要的是分清楚到底是软件问题,还是硬件问题?
我见过很多老实巴交的软件朋友一遇到问题就打开工程查软件bug,那只会让我觉得你头秃是有原因的。
同时也要对所收集的信息进行一些筛选和排除,因为一个现象对于不同的人会有不同的描述,有些客户并不是专业人士一些现象描述得不清楚,有可能把你带入误区。
所以结合系统日志信息、目前设备状态和售后或者客户描述,进行初步的问题定位。
2
不能全靠猜
很多朋友了解了具体的问题以后就抱着猜一猜的心态,凭感觉去修改代码,如果问题不再出现就认为是修护了该问题,这样的做法是不科学的。
作为一名工程师还是要本着务实求真的态度,一步一步的缩小问题的范围,通过安插测试程序来检测难以复现的偶发性问题,让工程师来主动查找bug,还不如安插一些bug捕捉程序来自动监测bug,这样也会更加的精准。
多模拟一些问题出现频率较高的环境和状态,比如有一个问题专门在晚上发生,那么我们可以构建一个晚上的环境,比如系统时钟的调整、系统访问用户的增加或者晚上的一些特殊操作等等。
从而进一步降低复现问题的成本。 |