一、概览
IntelliJ IDEA的调试器不仅仅是"设置断点-查看变量"那么简单,它是一个全功能的交互式调试环境,支持:
(1)智能代码分析:在调试时提供实时代码洞察
(2)热重载调试:不重启应用即可应用代码更改
(3)协程和异步调试:轻松处理并发问题
(4)智能步入:自动过滤库代码,直接进入你的业务逻辑
二、调试基础:从第一个断点开始
2.1 设置和管理断点
// 示例:设置不同类型的断点
public class DebugDemo {
public void processData(List<String> data) {
// 行断点:最简单,点击行号左侧
System.out.println("开始处理数据");
// 条件断点:右键断点 -> 设置条件
for (String item : data) {
// 只在item包含"error"时暂停
processItem(item);
}
// 记录断点:不暂停,只记录消息
log.debug("数据处理完成");
}
// 方法断点:点击方法声明行左侧
private void processItem(String item) {
// 方法进入/退出时暂停
}
}
快捷键速查:
Ctrl+F8:切换断点
Ctrl+Shift+F8:查看所有断点
鼠标右键点击断点:高级设置
2.2 启动调试会话
多种启动方式:
(1)标准模式:点击调试按钮(绿色的虫子图标)
(2)附加到进程:调试已在运行的应用
(3)远程调试:调试远程服务器上的应用
# 远程调试JVM参数示例
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar app.jar
运行配置技巧:
(1)复制配置:Ctrl+D
(2)修改VM选项:设置内存、系统属性等
(3)使用模板:创建常用调试模板
三、高级调试技巧
3.1 条件断点与日志断点
条件断点的艺术:
// 1. 简单条件
// 条件:index == 5
for (int i = 0; i < 10; i++) {
process(i);
}
// 2. 复杂表达式
// 条件:user != null && user.getAge() > 18
public void processUser(User user) {
// ...
}
// 3. 字段监视断点
// 在字段上设置断点,当字段被访问/修改时暂停
private String sensitiveData;
日志断点(不暂停):
// 设置:右键断点 -> Suspend = None, Log message = "Processing item: {item}"
// 输出到控制台但不中断执行
processItems(items);
3.2 智能步入:避开噪音
设置方法:
1.Shift+F7 智能步入
2.自动跳过库代码、getter/setter
3.配置要跳过的包:Settings → Build, Execution, Deployment → Debugger → Stepping
public class UserService {
public User getUser(Long id) {
// 智能步入会直接进入getFromDatabase,跳过getUser方法中的验证逻辑
return userRepository.findById(id)
.orElseThrow(() -> new NotFoundException("User not found"));
}
}
3.3 表达式求值:实时代码实验
使用场景:
public void complexCalculation(Data data) {
// 调试时暂停在此行
double result = calculate(data);
// 右键 → Evaluate Expression(Alt+F8)
// 可以输入:
// 1. data.getItems().size()
// 2. calculate(newData) // 测试不同参数
// 3. new SimpleDateFormat("yyyy-MM-dd").format(new Date())
}
技巧:
(1)Ctrl+Alt+F8:快速求值选中的表达式
(2)拖放变量到Watches窗口
(3)在Watches中使用Lambda表达式:list.stream().filter(x -> x > 5).count()
3.4 修改变量值:即时修复测试
public void processOrder(Order order) {
// 暂停在此处时:
// 1. 右键order → Set Value
// 2. 修改order.amount = 100.0
// 3. 继续执行,测试不同金额的逻辑
validateOrder(order);
calculateDiscount(order);
}
四、常见问题解决
Q1:调试时程序很慢?
解决:
(1)禁用不必要的断点
(2)使用条件断点减少暂停次数
(3)禁用"Collect runtime information"选项
Q2:断点不生效?
检查:
(1)断点是否被禁用(灰色)
(2)类是否被热交换过
(3)是否在正确的模块/类路径中
Q3:变量值显示"null"或无法计算?
解决:
(1)检查变量作用域
(2)使用"Force Return"测试不同返回值
(3)检查是否编译了调试信息(-g参数)
3355

被折叠的 条评论
为什么被折叠?



