IDEA中debug的使用

一、概览

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参数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值