解决 Bug 经验
调Bug是程序员的日常。今天分享一些解决Bug的经验。
调Bug的正确姿势
1. 复现问题
首先要能稳定地复现这个Bug。
不能复现的Bug最难调。如果用户报了一个Bug但你复现不了,要问清楚:什么操作、什么数据、什么环境。
2. 看日志
日志是调Bug最重要的信息来源。
- 有没有报错?报错信息是什么?
- 请求是不是正常进来了?
- 数据是不是正确的?
学会看日志能解决大部分问题。
3. 缩小范围
Bug出在哪个环节?
- 是前端的问题还是后端的问题?
- 是代码的问题还是配置的问题?
- 是这次改动引入的还是之前就有?
缩小范围,快速定位。
4. Debug
打断点,一步一步跟着走,看每一步的结果是不是符合预期。
5. 二分法
如果代码很长,不知道问题出在哪里,可以用二分法。
先注释掉一半代码,看问题还在不在。在的话问题在没注释的那一半,不在的话在注释的那一半。
重复这个过程,快速定位。
常见Bug类型
空指针(NullPointerException)
最常见的Bug。某个对象是null,你调用了它的方法。
检查对象是否为null,做好判空。
数组越界
访问数组或列表的时候下标超出范围了。
检查下标是否正确。
并发问题
多线程同时操作一个数据,导致数据错乱。
这种Bug最难调,因为不一定能复现。
数据库问题
SQL写错了、索引没加导致慢查询、事务问题……
配置问题
环境变量没配、配置文件写错、依赖版本不对……
一些经验
1. 先怀疑自己
出了Bug,先想是不是自己代码的问题。不要第一时间怀疑框架或者环境。
2. 改一个地方就测一下
不要一次改很多地方,改一个测一个,这样知道是哪个改动生效了。
3. 记录下来
遇到的Bug和解决方法记下来。下次遇到类似的,翻笔记就行。
4. 不要死磕
卡了超过2小时还没解决,就去问人。死磕浪费时间。
5. 休息一下
有时候卡住了,休息一下回来就想通了。
最后
调Bug是经验积累的过程。
遇到的Bug多了,解决得多了,以后遇到类似的问题就能快速解决。
不要害怕Bug,每解决一个Bug你就成长一点。
