1. 概述

远程调试是开发人员排查线上或远程进程中疑难问题的利器。无论是定位诡异的运行时 Bug,还是分析性能瓶颈和资源泄漏,远程调试都能提供强大的支持。

本文将详细介绍如何使用 JetBrains IntelliJ IDEA 进行远程调试。我们首先需要对目标应用的 JVM 启动参数进行配置,使其支持调试连接。

2. 配置 JVM 启动参数

我们以一个 Spring 定时任务示例应用 为例,方便在定时任务中设置断点进行调试。

IntelliJ IDEA 在远程调试配置中会自动生成推荐的 JVM 参数:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005

2.1 参数详解

上述参数基于 Java Debug Wire Protocol(JDWP),关键部分说明如下:

  • transport=dt_socket:使用 Socket 通信方式
  • server=y:表示当前 JVM 是调试目标(被调试方)
  • suspend=n:应用启动时不暂停,直接运行(若设为 y 则会等待调试器连接后再启动)
  • address=*:5005:监听所有网卡的 5005 端口,供调试器接入

✅ 建议开发环境使用 suspend=n,避免服务卡住
❌ 生产环境严禁开启,存在安全风险 ⚠️

先构建项目:

mvn clean package

然后启动应用,并带上调试参数:

java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 \
  target/gs-scheduling-tasks-0.1.0.jar

执行后你会看到类似输出:

Listening for transport dt_socket at address: 5005

说明 JVM 已准备就绪,等待调试器接入。接下来切换到 IntelliJ IDEA。

3. IntelliJ IDEA 调试配置

在 IntelliJ 中创建远程调试配置:

  1. 点击 Run → Edit Configurations…
  2. 点击左上角 + 号,选择 Remote JVM Debug
  3. 配置 Host 为远程服务器 IP(本地测试可用 localhost),Port 为 5005
  4. 确保模块(Module)正确选择为目标项目

run configuration

配置完成后,点击 Debug 按钮发起连接。

✅ 首次连接成功后,IDE 会显示 “Connected to the target VM” 提示
❌ 若连接失败,请检查防火墙、端口占用或 IP 是否正确

4. 开始远程调试

连接成功后,打开 ScheduleTask 类,在定时方法处设置断点:

public void reportCurrentTime() {
  log.info("The time is now {}", dateFormat.format(new Date()));
}

由于该任务每 5 秒执行一次,断点很快就会被触发。此时你可以在 IDE 中:

  • 查看调用栈(Call Stack)
  • 检查变量值(Variables)
  • 单步执行(Step Over/Into)
  • 修改变量值(Set Value)

4.1 实用技巧与限制

调试启动逻辑

如果想调试应用启动过程(如 main 方法、Bean 初始化),需将 JVM 参数中的 suspend 改为 y

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005

这样 JVM 会暂停等待调试器连接,连接后再继续启动流程。

日志输出问题

⚠️ 远程调试时,控制台日志不会自动同步到 IDE。建议:

  • 将日志输出到文件(如 logs/app.log
  • 在 IntelliJ 中通过 Tools → Attach to Process 或直接打开日志文件进行查看
  • 或使用 tail -f 实时监控

安全与使用建议

✅ 适用场景:

  • 开发/测试环境问题复现
  • 本地无法模拟的集成问题

❌ 禁止在生产环境使用:

  • 开启调试会降低性能
  • 存在代码泄露、RCE 等安全风险
  • 可能影响服务稳定性

5. 总结

IntelliJ IDEA 的远程调试功能配置简单、效果强大,是排查复杂问题的必备技能。

我们演示了:

  • 如何配置 JVM 启动参数
  • IDEA 中创建远程调试配置
  • 实际断点调试流程
  • 注意事项与最佳实践

掌握这套流程后,哪怕问题是在线上预发环境出现的,也能快速“抓”下来本地复现,效率提升不是一点点。

示例代码详见:GitHub - spring-scheduling


原始标题:Remote Debugging with IntelliJ IDEA