9条基本调试规则:
- Understand The System
- Make It Fail
- Quit Thinking and Look
- Divide and Conquer
- Change One Thing At A Time
- Keep An Audit Trail
- Check The Plug
- Get A Fresh View
- 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端可以显示
- 怀疑是cdn的问题,怀疑不同的user-agent返回不同的内容,切换不同user-agent进行验证
- 怀疑是cdn的问题,怀疑不同的网络返回不同的内容,切换wifi和4G进行验证
发现跟上面2个没关系,抓包看到返回的数据字节长度是一样的。
- 怀疑是图片的问题。
发现同样的图片二进制文件,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,防止下次遇到同样的问题