调试技巧:让 Bug 无所遁形
调试是程序员的必备技能。再牛的程序员,写出来的代码也需要调试。
调试的本质是观察程序运行时的状态,找到预期和现实之间的差距。
调试类型
| 类型 | 适用场景 | 工具 |
|---|---|---|
| 本地调试 | 开发环境 | IDEA / Eclipse |
| 远程调试 | 测试/生产环境 | IDEA + JVM 参数 |
| 生产调试 | 生产环境 | Arthas / JMX |
远程调试配置
应用启动时加上 JVM 参数:
bash
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar app.jar参数说明:
| 参数 | 含义 |
|---|---|
transport | 通信方式,dt_socket = Socket 方式 |
server=y | 作为服务器等待 IDE 连接 |
suspend=n | 启动时不暂停(JVM 启动完再连) |
address=5005 | 监听端口 |
然后在 IDEA 里:Run → Edit Configurations → Add New → Remote JVM Debug,填入 Host 和 Port。
IDEA 调试技巧
条件断点
只在满足某个条件时暂停,节省时间:
java
for (Order order : orders) {
// 右键断点 → Condition: order.getAmount() > 1000
processOrder(order);
}异常断点
让程序在抛出特定异常时暂停:
- 按
Ctrl + Shift + F8打开 Breakpoints - 点击
+ - 选择 Java Exception Breakpoints
- 输入异常类型,如
NullPointerException - 选择 Caught(捕获的)或 Uncaught(未捕获的)
计算表达式
调试时停在某行,选中表达式按 Alt + F8,可以输入任意表达式查看结果:
selectedOrder.getUser().getName() // 输入,按 Eval 查看Drop Frame:退回重跑
调试时点过头了?不需要重启,直接点击调试面板的 Drop Frame 按钮,回到上一个方法调用的入口,重新来过。
Force Return
调试时发现某方法返回的值不对?不需要改代码,直接在调试面板右键变量 → Force Return,指定返回值跳过当前逻辑。
常见场景
场景1:循环次数多,定位特定迭代
java
for (int i = 0; i < orders.size(); i++) {
// 条件断点:i == 999(只想停在最后一次)
processOrder(orders.get(i));
}场景2:多线程调试
多线程同时断住,调试面板里切换线程:
- 左侧 Threads 面板切换线程
- 选中 "All threads suspended" 决定是否所有线程都暂停
场景3:观察对象字段变化
在 Variables 面板,右键对象 → Add to Watches,可以持续观察某个变量的值变化。
总结
- 条件断点:减少无效停顿
- 异常断点:第一时间捕获问题
- Evaluate:不用改代码就能算表达式
- Drop Frame:点错可以重来
- Force Return:改返回值跳过逻辑
调试是程序员的第三只眼睛,学会用它,就能看见代码运行时的真相。
