Skip to content

调试技巧:让 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);
}

异常断点

让程序在抛出特定异常时暂停:

  1. Ctrl + Shift + F8 打开 Breakpoints
  2. 点击 +
  3. 选择 Java Exception Breakpoints
  4. 输入异常类型,如 NullPointerException
  5. 选择 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,可以持续观察某个变量的值变化。

总结

  1. 条件断点:减少无效停顿
  2. 异常断点:第一时间捕获问题
  3. Evaluate:不用改代码就能算表达式
  4. Drop Frame:点错可以重来
  5. Force Return:改返回值跳过逻辑

调试是程序员的第三只眼睛,学会用它,就能看见代码运行时的真相。

基于 VitePress 构建