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 |