【debug调试详解-idea】

debug调试详解-idea

  • 一、Debug模式是什么?
  • 二、如何打断点?
    • [2.1 设置行断点(最常用)](#2.1 设置行断点(最常用))
    • [2.2 条件断点(进阶技巧)](#2.2 条件断点(进阶技巧))
    • [2.3 异常断点](#2.3 异常断点)
  • 三、启动Debug模式
  • 四、Debug窗口详解
  • 五、调试按钮详解(步进操作)
  • 六、查看变量值的多种方式
    • [6.1 悬停提示(最快捷)](#6.1 悬停提示(最快捷))
    • [6.2 内联提示(Inline Values)](#6.2 内联提示(Inline Values))
    • [6.3 Variables面板](#6.3 Variables面板)
    • [6.4 Watches(监视)](#6.4 Watches(监视))
  • [七、Evaluate Expression(计算表达式)⭐](#七、Evaluate Expression(计算表达式)⭐)
    • [7.1 使用方法](#7.1 使用方法)
    • [7.2 实用场景示例](#7.2 实用场景示例)
  • [八、远程调试(Remote Debug)](#八、远程调试(Remote Debug))
    • [8.1 第一步:启动远程程序(带调试参数)](#8.1 第一步:启动远程程序(带调试参数))
    • [8.2 第二步:IDEA配置远程调试](#8.2 第二步:IDEA配置远程调试)
    • [8.3 第三步:开始远程调试](#8.3 第三步:开始远程调试)
  • 九、其他实用功能
    • [9.1 Drop Frame(回退执行)](#9.1 Drop Frame(回退执行))
    • [9.2 日志断点(Logging Breakpoint)](#9.2 日志断点(Logging Breakpoint))
    • [9.3 Mute Breakpoints(一键禁用所有断点)](#9.3 Mute Breakpoints(一键禁用所有断点))
    • [9.4 多线程调试](#9.4 多线程调试)
  • 十、快捷键速查表

一、Debug模式是什么?

Debug(调试)模式 是一种特殊的程序运行方式,它允许你在代码执行过程中"暂停"程序,逐行查看变量的值、方法的调用顺序,从而找出代码中的bug。

简单来说:

  • Run模式:程序一口气跑完,你只看得到最终结果

  • Debug模式:程序可以随时暂停,你可以看到每一步的变化

二、如何打断点?

断点(Breakpoint) 就像在代码中设置一个"路障",程序运行到这里就会暂停,让你检查当前状态。

2.1 设置行断点(最常用)

在代码编辑区左侧的行号旁边单击鼠标左键,会出现一个红色圆点,这就是断点:

  • 快捷键:Ctrl + F8(Windows/Linux)或 Cmd + F8(Mac)可以在光标所在行添加/取消断点。

2.2 条件断点(进阶技巧)

当断点在循环中时,你可能希望只在特定条件下暂停,比如 i == 5 时才停下来:

  • 1.右键点击断点(红点)

  • 2.在弹出的对话框中输入条件表达式,例如:i == 5

  • 3.只有条件为 true 时,程序才会在此暂停

使用场景:遍历包含1000个元素的列表时,只想看第500个元素的状态。

2.3 异常断点

程序报错时自动在出错位置暂停,无需手动猜测哪里会出问题:

点击菜单 Run → View Breakpoints(或按 Ctrl + Shift + F8)

点击 + 号,选择 Java Exception Breakpoints

输入异常类名,如 NullPointerException

设置后,只要程序抛出空指针异常,就会自动停在出错的那一行。

三、启动Debug模式

设置好断点后,有几种方式启动Debug:

方式 操作说明

菜单栏 Run → Debug

工具栏 点击甲虫图标🐞(绿色虫子),而不是绿色三角形▶️

快捷键 Shift + F9

启动后,程序会运行到第一个断点处暂停,代码行会变成蓝色高亮(表示当前执行位置)。

四、Debug窗口详解

程序在断点处暂停后,IDEA底部会打开Debug工具窗口,这是你的"指挥中心"

text 复制代码
┌─────────────────────────────────────────────────────────────┐
│ [调试按钮区]  ▶️ | ⏬ | ⏫ | ⏏️ | 📐 | 🧮 | ...              │
├─────────────────────────────────────────────────────────────┤
│ 左边:调用栈(Frames)          │ 右边:变量区(Variables)   │
│ - main()                       │ - name = "小明"            │
│ - UserService.getUser()        │ - age = 18                 │
│ - UserController.login()       │ - list = [1,2,3]           │
├─────────────────────────────────────────────────────────────┤
│ 底部:Watches(监视区)                                      │
│ - 自定义表达式的结果                                          │
└─────────────────────────────────────────────────────────────┘

核心功能区说明:

区域 作用
Frames 显示方法的调用链,点击可切换查看不同方法内的变量
Variables 显示当前方法内所有变量的值,可直接修改
Watches 手动添加要追踪的表达式,每次步进自动刷新
Console 显示程序的输出日志

五、调试按钮详解(步进操作)

这是Debug的核心操作,学会这些你就掌握了80%的调试技巧:

按钮 名称 快捷键 作用说明
▶️ Resume Program F9 继续运行到下一个断点,如果没有断点则运行结束
Step Over F8 单步执行:一行一行往下走,不进入方法内部
Step Into F7 步入:如果当前行有方法调用,进入该方法内部
🔥 Force Step Into Alt + Shift + F7 强制步入:连JDK源码都能进去(慎用)
⏏️ Step Out Shift + F8 步出:从当前方法跳出,返回到调用处
📐 Run to Cursor Alt + F9 运行到光标处:光标在哪,程序就运行到哪
🧮 Evaluate Expression Alt + F8 计算表达式:调试时执行任意代码

实战示例:

java 复制代码
public class Demo {
    public static void main(String[] args) {
        int result = add(3, 5);      // 断点打在这里
        System.out.println(result);
    }
    
    static int add(int a, int b) {
        return a + b;                 // Step Into 会进入这里
    }
}

按 F7(Step Into)会进入 add 方法内部;按 F8(Step Over)会直接计算完 add(3,5) 得到结果,不进去看细节。

六、查看变量值的多种方式

6.1 悬停提示(最快捷)

鼠标悬停在变量名上,会弹出提示框显示当前值:

java 复制代码
String name = "张三";
System.out.println(name);  // 鼠标放在 name 上会显示 "张三"

6.2 内联提示(Inline Values)

在代码行末尾,IDEA会直接显示变量的值,例如:String name = "张三"; // 张三

6.3 Variables面板

Debug窗口右侧的Variables面板会列出当前所有变量及其值:

可以展开对象查看内部属性

右键点击变量 → Set Value(或按 F2)可以直接修改变量的值,用于测试不同分支逻辑

6.4 Watches(监视)

当你需要反复查看某个表达式的结果时,可以添加到Watches:

  • 1.右键点击变量或选中表达式

  • 2.选择 Add to Watches

  • 3.每次步进时,Watches区域会自动重新计算

七、Evaluate Expression(计算表达式)⭐

这是Debug模式的王牌功能!你可以在调试时执行任意代码,而不需要重新运行程序。

7.1 使用方法

  • 1.程序在断点处暂停

  • 2.按 Alt + F8(或点击工具栏的🧮图标)

  • 3.在弹出的窗口中输入你要执行的代码

  • 4.点击 Evaluate 查看结果

7.2 实用场景示例

java 复制代码
public class OrderService {
    public double calculate(double price, int quantity, double discount) {
        // 断点打在这里
        double subtotal = price * quantity;
        double finalPrice = subtotal * (1 - discount);
        return finalPrice;
    }
}

调试时,你可以:

输入表达式 作用
price * quantity 计算小计,验证乘法是否正确
discount * 100 把折扣转成百分比查看
subtotal > 100 ? subtotal * 0.9 : subtotal 测试满100打9折的逻辑
new Order().getStatus() 调用任意方法获取状态

你甚至可以在Evaluate窗口中修改变量的值来测试不同分支!

八、远程调试(Remote Debug)

远程调试允许你调试运行在另一台机器上的Java程序,或者调试不方便用IDEA直接启动的程序(如运行在Linux服务器上的应用)。

8.1 第一步:启动远程程序(带调试参数)

在启动远程Java程序时,需要添加JVM参数,让它等待调试器连接:

bash 复制代码
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar your-app.jar

参数说明:

  • transport=dt_socket:使用Socket通信

  • server=y:该程序作为服务端等待连接

  • suspend=n:不等待调试器连接就启动(设为y则会等)

  • address=5005:监听端口5005

8.2 第二步:IDEA配置远程调试

  • 1.点击 Run → Edit Configurations

  • 2.点击 + → 选择 Remote JVM Debug

  • 3.配置信息:

配置项 填写内容
Name 随意,如 "Remote-Debug"
Host 远程服务器IP,本地则填 localhost
Port 5005(与启动参数一致)
使用模块的classpath 选择你的项目模块
  • 4.点击 Apply → OK

8.3 第三步:开始远程调试

  • 1.先在本地代码中打好断点

  • 2.点击Debug按钮(虫子图标),选择刚创建的Remote配置

  • 3.IDEA会连接到远程JVM,当远程程序执行到断点对应的代码行时,就会暂停

注意:本地代码必须与远程运行的代码版本一致,否则行号对不上,断点无法生效

idea设置远程debug步骤:

九、其他实用功能

9.1 Drop Frame(回退执行)

当你进入一个方法后发现走错了,想重新执行这个方法,可以使用 Drop Frame:

  • 点击调试工具栏的 ↺ 图标

  • 效果:退回到当前方法的调用处,可以重新进入

注意:这不会回退数据状态的改变(比如数据库插入操作已执行),主要用于重新走流程。

9.2 日志断点(Logging Breakpoint)

如果你只想看日志而不想让程序暂停,可以使用日志断点:

  • 1.右键点击断点

  • 2.取消勾选 Suspend(暂停)

  • 3.勾选 Evaluate and log,并输入要打印的表达式,如 "当前i的值:" + i

效果:程序正常运行不暂停,但控制台会打印出你指定的信息。

9.3 Mute Breakpoints(一键禁用所有断点)

点击调试工具栏上的 🚫 图标,所有断点会变成灰色,程序可以不受干扰地运行到底。再次点击恢复。

9.4 多线程调试

默认情况下,一个线程的断点会阻塞所有线程。如果你想只阻塞当前线程,让其他线程继续运行:

  • 1.右键点击断点

  • 2.在 Suspend 中选择 Thread 而不是 All

十、快捷键速查表

功能 Windows/Linux Mac
添加/取消断点 Ctrl + F8 Cmd + F8
Debug启动 Shift + F9 Ctrl + D
Resume (继续到下一断点) F9 Cmd + Option + R
Step Over (步过) F8 F8
Step Into (步入) F7 F7
Step Out (步出) Shift + F8 Shift + F8
Run to Cursor Alt + F9 Option + F9
Evaluate Expression Alt + F8 Option + F8
查看所有断点 Ctrl + Shift + F8 Cmd + Shift + F8
相关推荐
程序猿阿越2 小时前
AutoMQ源码(一)读、写、Compaction
java·后端·源码
ywl4708120872 小时前
jwt生产token,简单版helloworld
java·数据库·spring
未若君雅裁2 小时前
生产问题排查与性能瓶颈定位:日志、监控、链路追踪、压测与Arthas
java·web安全
器灵科技2 小时前
AI视频工具实测:Seedance/可灵/HappyHorse谁最能打?
java·运维·数据库·人工智能·github
南部余额2 小时前
RabbitMQ 进阶:延迟队列完全指南
java·分布式·spring·rabbitmq
phltxy2 小时前
Spring AI Agents 智能体模式实战
java·人工智能·spring
摇滚侠3 小时前
MyBatis 入门到项目实战 特殊 SQL 的执行 34-37
java·sql·mybatis
phltxy3 小时前
Spring AI 可观测性与 Zipkin 实战
java·人工智能·spring
兰令水3 小时前
leecodecode【面试150】【2026.6.13打卡-java版本】
java·算法·leetcode