根据自身经历诠释《调试九法》

2019-07-13 23:51发布

9条基本调试规则:
  1. Understand The System
  2. Make It Fail
  3. Quit Thinking and Look
  4. Divide and Conquer
  5. Change One Thing At A Time
  6. Keep An Audit Trail
  7. Check The Plug
  8. Get A Fresh View
  9. If You Didn’t Fix It, It Ain’t Fixed

Understand The System

案例:celery卡住
现象:每隔一段时间,celery就会卡住,明明worker有空闲,却不执行任务。 同事的解决方法是每天凌晨定时重启celery worker来避开这个问题。
但是这问题很奇怪啊,它吸引了我的注意力。
于是我:
- 过了一遍celery官方文档
- 浏览了celery在github上的大部分issue
- 过了一遍celery的changelog
- 拉celery源码,分析原理和梳理流程。并自己写了一个简单的任务队列(这个后面会专门写一篇blog说明怎么写一个简单的任务队列) 当我做了上面几件事的时候,bug的原因自然而然的付出水面了,在本地构造环境重现了这bug。

Make It Fail

案例:全站https后,系统里上传不了七牛图片。
现象:打开Chrome的开发者工具,报Failed to load resource: net::err_insecure_response upload.qiniu.com 于是直接在chrome访问https://upload.qiniu.com, 地址栏左边显示了“不安全”的图标,说明证书有问题,于是联系七牛的人,对方给了个新域名,问题解决。

Quit Thinking and Look

案例:修旧系统的bug
现象:旧系统有个功能一年多没人用了,突然有一天有人想用,发现用不了。由于是旧系统,大家都不太熟悉。我根据sentry的报错,给了一行代码让负责的同事加上看看。结果他试了一个下午,没有解决。 下班前我过去看了一下sentry的报错信息,在一大堆的异常堆栈代码中,发现报错的业务代码行号跟本地的代码行号不一致,问他是不是部署错了。果然,本来是要部署web server的代码,结果一个下午都在部署api server的代码。一开始给的那行代码是可以解决原本问题的,结果他以为是代码有问题,各种尝试其它想法,弄了一个下午。

Divide and Conquer

二分法逐步逼近缩小范围。
消除噪声干扰。
比如遇到一个问题,判断是本平台的问题还是第三方平台的问题;判断是前端的问题还是后端的问题;判断是哪个版本的问题;…;

Change One Thing At A Time

就跟做实验一样,控制变量。一次只做一件事情,排除其它的干扰。 案例:移动端房源列表页有一张图片显示不了,而pc端可以显示
现象:移动端房源列表页有一张图片显示不了,而pc端可以显示
  1. 怀疑是cdn的问题,怀疑不同的user-agent返回不同的内容,切换不同user-agent进行验证
  2. 怀疑是cdn的问题,怀疑不同的网络返回不同的内容,切换wifi和4G进行验证
    发现跟上面2个没关系,抓包看到返回的数据字节长度是一样的。
  3. 怀疑是图片的问题。
    发现同样的图片二进制文件,mac系统都显示不了,只有在chrome中能显示。chrome兼容性强,连有问题的图片都能显示。
    让运营重新上传一张图片,问题解决。

Keep An Audit Trail

案例1: 游戏服务器突然访问不了。
现象: 游戏服务器突然访问不了。游戏服务器是用的腾讯的CVM。 之前可用,突然不可用,说明很可能是最近的动作导致。
当天没有发版,说明很可能不是代码的问题,而是第三方配置的问题。
让同事想想最近做了什么,修改了什么。他想起了在开放平台修改了个配置。问题解决。 案例2: 应用服务器突然报编码错误。
现象: 之前好好的,应用服务器突然报编码错误。 之前好好的,当天并没有发版,说明很可能不是代码的问题。
让同事想想最近做了什么,修改了什么。他想起了换了一台新机器。原来是新机器没有中文语言包。sudo apt-get install language-pack-zh-hans解决。

Check The Plug

很多时候的bug是其它方面的bug, 跟代码本身无关。这让我想起《IT狂人》的一个情景,当主角接到电脑用不了的求助电话时的答复套路:
1. 你插电源了吗
2. 你重启电脑试试看 虽然好笑,但是确实是有效,确实很多人经常犯这种错误。
比如别人问我“我连接不了本地的redis”,我会回答“你本地启动了redis了吗”
“你改错文件了”
“你进错机器了”
“你拼写错了”
“你没更新”

Get A Fresh View

请教他人
跟他人讨论
重新表述问题给小黄鸭听
往往会有新的观点

If You Didn’t Fix It, It Ain’t Fixed

查证bug已被修复
查证确认是自己的修复措施解决了问题
从根本解决问题
记录bug,防止下次遇到同样的问题