程序员如何做「调试技巧」:不是靠猜,是靠方法
调试是程序员最核心的技能之一。
会调试的人,bug 分分钟定位;不会调试的人,bug 猜半天还找不到。
一、调试的基本步骤
1. 复现问题
能复现才能定位。
记录:什么操作、什么数据、什么环境。
2. 收集信息
- 日志
- 堆栈
- 变量值
- 断点
3. 提出假设
根据现象,提出可能的根因假设。
4. 验证假设
用实验验证假设是否正确。
5. 定位根因
找到真正的 bug 所在。
6. 修复验证
修复后确认问题不再出现。
二、调试方法
1. 日志调试
在关键位置加日志,记录变量值。
log.info("orderId={}, userId={}, status={}", orderId, userId, status);
适合:生产环境、无法打断点的情况。
2. 断点调试
在 IDE 中打断点,逐步执行。
- Line breakpoint:普通断点
- Conditional breakpoint:条件断点
- Watch:监视变量值
适合:开发环境、问题能复现。
3. 打印调试
最简单粗暴:System.out.println()。
适合:临时排查、快速验证。
4. 二分调试
注释掉一半代码,看问题是否还在。
逐步缩小范围,快速定位。
5. 对比调试
对比正确版本和出错版本的差异。
适合:改了什么之后出 bug 的情况。
三、常见 bug 定位技巧
1. 空指针
看堆栈,找到哪一行。
看变量值,哪个对象是 null。
2. 数组越界
看数组长度,看访问的下标。
3. 并发问题
看线程堆栈,看锁的状态。
用 Thread Dump 分析。
4. 内存泄漏
用 MAT 分析 heap dump。
看对象引用链,找 GC Root。
四、调试心态
1. 不要慌
越慌越容易出错,越慌越想不出方案。
2. 小步验证
一次只改一个地方,改完验证再改。
3. 相信数据
日志和堆栈不会说谎。
4. 记录过程
调试过程记录下来,下次遇到类似问题有参考。
五、一句话总结
调试技巧 = 复现问题 + 收集信息 + 提出假设 + 验证假设 + 定位根因 + 修复验证,方法(日志/断点/打印/二分/对比)。