要想从能发现Bug进阶到能快速定位Bug
先建立定位问题的流程
稳定复现 – 找到必现的最短途径,或者提高复现概率的条件组合。
信息收束 – 环境、账号、数据、时间点、操作步骤,全都固化下来。
划定范围 – 用二分排除法快速缩小可疑模块(前端?后端?中间件?数据?)
假设驱动 – 根据现象提出 2~3 个最可能的根因假设,然后逐一测试。
证据流程 – 用日志、抓包、数据库查询、截图等,把原因找出来”。
把这套流程练成肌肉记忆,速度自然就上来了。
快速定位不是靠猜,而是靠信息差,能看到开发看不到的全局。
1. 日志
服务端日志:熟悉各服务的日志途径、级别(debug/info/error),学会 grep、tail -f 结合重点和时间戳准确捞取。
客户端日志:Web 控制台、App 的抓包日志(Charles/Fiddler)、崩溃日志。
技巧:拿到报错不要只看最后一行,要往前追溯第一个异常点,那往往才是根因。
2. 接口和抓包
必会工具:浏览器 DevTools Network 面板、Postman、Charles。
重点:请求参数是不是正确、返回体结构、HTTP 状态码、响应时间。如果接口返回了错误码,马上去查接口文档或代码中该错误码的定义,立刻就能缩小 80% 的排查范围。
3. 数据库和缓存
直接查库:学会写简单的 SELECT 语句,证实数据落库是不是正确、状态字段是不是更新、关联表数据是不是一致。
查缓存:Redis/Memcached 里的数据是不是和 DB 一致?缓存是不是过期?很多时好时坏的 Bug 都是缓存引起的。
4. 系统资源和中间件
遇到性能类或偶发超时问题,立刻看CPU、内存、磁盘 IO、网络连接数。
消息队列(Kafka/RabbitMQ)里是不是有积压?消费是不是正常?
提升分析能力的六个技巧
1. 复杂问题要学会切蛋糕
面对一个庞大的业务场景,不要整条链路地排查。用二分隔离法:
先确定是前端还是后端:请求是不是发出去?服务端是不是收到?
再隔离到具体服务:调了 A、B 两个服务,直接 Mock 掉 A 的返回,看 B 是不是正常。
准确到代码模块:通过接口返回的报错信息,找到调用链中报错的那个函数。
2. 对比法
账号/数据对比:出错的账号和正常的账号,在数据库里逐字段对比,差别点往往就是根因。
版本对比:上个版本正常,这个版本异常,立刻去查代码 diff,看改了哪些思路。
环境对比:测试环境好,预发环境坏,对比两边的配置、网络方法、基础数据。
3. 学会读代码
不需要像开发那样深,但至少要能:
根据接口途径找到 Controller,根据报错堆栈定位到具体类和方法。
看懂简单的 if/else 判断思路,找出没有包括到的分支。
当你跟开发说你这段在参数为 null 时,会跳过权限检查,定位 bug 的效率已经超过90%的测试。
4. 建立自己的错误库
每排查完一个经典 Bug,都做个极简记录:
现象:超时、空指针、数据重复、状态不流转。
归类:并发未加锁、幂等未处理、配置遗漏、字段溢出、思路判断反了。
定位途径:从哪段日志能直接看出来。
下次再遇到相似现象,大脑会自动触发这个像上次的并发问题,试错次数极大减少。
5. 培养反向思维和边界敏感
多数隐蔽 Bug 都藏在边界和异常处理里:
如果正常的流程是 A→B→C,那主动去想:A 之后直接跳到 C 会怎样?B 执行到一半报错会怎样?
观察数据时,永远对0、null、空字符串、最大最小值、超长字符串保持敏感,这些都是快速定位的引爆点。
在提给开发之前整理一遍,也是强迫自己把问题想透:
Where:哪个环境、哪个服务、哪个页面?
When:精确到秒的操作时间,服务端时间还是客户端时间?
Who:哪个账号、哪种角色、哪个设备?
What:具体现象,预期 vs 实际。
Why:你自己的初步判断(哪怕错了也能打开思路)。
How:必现的复现步骤,附带最小数据集。
每天深究一个 Bug 的根因:哪怕不是你负责的,也去问开发“是什么原因”,然后回到日志里去复现那条证据链。
看开发的修复代码:看他们改了几行,改在哪个方法里,为什么这么改。
做技术分享:把经典案例抽象出来,讲给其他人听,教是最好的学。
快速定位不是天赋,是用框架思考 + 对信息的敏感度堆出来的。每多问一次为什么,你的定位速度就快一秒。