刚入行那会儿,我几乎每天都在修Bug。,有时候刚上线的新功能没过一天,就被打回,那时的我,以为自己只是代码没写好。
直到有一天,我第一次打开了 Charles,才发现——很多我的Bug,根本不是代码问题。
一、从写代码到看流量
那是一个夏天,我们上线一个会员系统。测试反馈:“会员中心打不开。” 我看日志一切正常,后端同事也说接口没问题。我心想:那问题一定在前端。
可我打开浏览器,看到的只是“加载中...”。没有错误提示、没有异常日志。
后面我在群里看到后端发了一句话:“是不是请求没发出去?”
那一刻,我脑海里第一次闪过: ——我需要“看见”网络到底发生了什么。
于是我下载了 Charles。
当我第一次看到所有HTTP请求像河流一样从屏幕上流过时,我突然意识到,原来系统世界一直都在有交流,只是我以前没有去看。
二、第一个被我“看见”的Bug
我开始捕捉那个打不开的页面请求。
很快我看到:
请求路径是 /api/v1/member/info,状态码是 302。
我点进去看详情,Charles显示:被重定向到了一个错误的域名。
原来,我们部署时环境变量写错了,接口请求发到了预发布服务器。
我把截图发给后端, 他一句话没说,只发了三个字:“我改了。”
页面瞬间恢复。
那一刻,我真正体会到什么叫**“用数据说话”**。
三、从“被动排查”到“主动预防”
自那以后,我几乎每天都开着 Charles。我发现,调试不只是为了“找错”,更是为了提前看见潜在的问题。
例如—— 在一次移动端版本测试中,我发现接口响应耗时比平时长。 我在 Charles 的 Timeline 中看到: 请求耗时几乎是原来的3倍。
后端查看日志才发现,数据库新增了索引,导致查询语句命中率下降。
从那以后,我们上线前都会用 Charles 做一次流量测试,提前排查延迟与异常请求。
四、我发现的“调试力”
随着使用越来越多,我意识到: Charles并不只是一个抓包工具。 它让我养成了一种新的思维方式。
① 追因思维:不信日志,只信流量
有时候日志会遗漏,但请求不会说谎。 我学会了通过Header、参数、响应状态来还原真相。
② 系统思维:Bug不是孤立的
当我能看到一个页面发出的十几个请求,我就理解了系统间的依赖关系。
③ 数据思维:判断不靠猜,靠证据
每次复现Bug前,我都会先用 Charles 导出 .chls 文件, 把“证据”交给同事。
从此,讨论从“感觉”变成“分析”。
五、移动端那次“奇迹般”的复盘
后来有一次,我们的App被用户疯狂投诉。 症状是:支付成功后,订单页面却没更新。
后端说接口正常,前端说请求发了。双方争论不休。
我用 Charles 抓取了手机端流量,发现支付成功后,前端立即跳转了页面,导致请求在弱网下被中断。
我模拟3G网络(Throttle功能),重现了同样的错误。问题解决
六、Charles带给我的,不只是工具技巧
使用Charles这几年,我从一个“修Bug的人”,变成了一个能让系统变稳的人。
我学会了:
- 提前在弱网下测试接口;
- 用Rewrite模拟异常响应;
- 用Map Local提前Mock未完成的API;
- 用Export日志让团队快速复现问题。
后来新同事遇到网络问题时,我经常笑着说:“别猜,用Charles看。”
七、从个人到团队:我带着Charles上了生产线
后来我们把Charles融入了整个项目流程。
- 测试阶段统一导出请求日志;
- 前端在开发初期使用Map Local Mock接口;
- 后端上线前通过Throttle做延迟测试。
从那时起,我们的Bug复现率从70%提升到97%,联调时间缩短了40%。
有同事说:“现在感觉查问题比写代码还快。”
我知道,那不只是因为工具,更是因为整个团队学会了用数据交流。
推荐资源
如果你也想像我一样真正学会用Charles,可以访问 Charles国内中文网
这里有:
- Charles详细中文教程;
- HTTPS证书配置指南;
- 实战案例和Rewrite规则模板;
- 以及移动端抓包实操指南。
调试,是理解系统的另一种方式
现在回想起来,我成长最快的那几年,不是在写更多代码,而是在看清代码之外的世界。
Charles让我第一次看见,原来系统是活的、透明的、有脉络的。写代码让我创造功能,用Charles让我理解系统