IDEA中debug的使用

一、概览

IntelliJ IDEA的调试器不仅仅是"设置断点-查看变量"那么简单,它是一个全功能的交互式调试环境,支持:

(1)智能代码分析:在调试时提供实时代码洞察

(2)热重载调试:不重启应用即可应用代码更改

(3)协程和异步调试:轻松处理并发问题

(4)智能步入:自动过滤库代码,直接进入你的业务逻辑

二、调试基础:从第一个断点开始

2.1 设置和管理断点

java 复制代码
// 示例:设置不同类型的断点
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)远程调试:调试远程服务器上的应用

bash 复制代码
# 远程调试JVM参数示例
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar app.jar

运行配置技巧:

(1)复制配置:Ctrl+D

(2)修改VM选项:设置内存、系统属性等

(3)使用模板:创建常用调试模板

三、高级调试技巧

3.1 条件断点与日志断点

条件断点的艺术:

java 复制代码
// 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;

日志断点(不暂停):

java 复制代码
// 设置:右键断点 -> Suspend = None, Log message = "Processing item: {item}"
// 输出到控制台但不中断执行
processItems(items);

3.2 智能步入:避开噪音

设置方法:

1.Shift+F7 智能步入

2.自动跳过库代码、getter/setter

3.配置要跳过的包:Settings → Build, Execution, Deployment → Debugger → Stepping

java 复制代码
public class UserService {
    public User getUser(Long id) {
        // 智能步入会直接进入getFromDatabase,跳过getUser方法中的验证逻辑
        return userRepository.findById(id)
            .orElseThrow(() -> new NotFoundException("User not found"));
    }
}

3.3 表达式求值:实时代码实验

使用场景:

java 复制代码
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 修改变量值:即时修复测试

java 复制代码
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参数)

相关推荐
老华带你飞2 小时前
个人网盘管理|基于springboot + vue个人网盘管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
宸津-代码粉碎机2 小时前
告别繁琐SQL!MyBatis - Flex让数据库操作“飞”起来
java·服务器·tomcat
艾莉丝努力练剑2 小时前
【Linux进程(四)】深入理解 Linux O(1) 调度器:双队列轮转与进程优先级机制——如何避免进程饥饿,实现公平且高效的进程调度
java·大数据·linux·运维·服务器·人工智能·安全
郑州光合科技余经理3 小时前
PHP构建:支撑欧美澳市场的同城生活服务平台开发
java·开发语言·数据库·uni-app·php·排序算法·生活
超级大只老咪10 小时前
数组相邻元素比较的循环条件(Java竞赛考点)
java
小浣熊熊熊熊熊熊熊丶10 小时前
《Effective Java》第25条:限制源文件为单个顶级类
java·开发语言·effective java
毕设源码-钟学长10 小时前
【开题答辩全过程】以 公交管理系统为例,包含答辩的问题和答案
java·eclipse
啃火龙果的兔子10 小时前
JDK 安装配置
java·开发语言
星哥说事10 小时前
应用程序监控:Java 与 Web 应用的实践
java·开发语言