背景
测试环境报错,但很难排查到问题,可以像本地debug的方式来调试远程代码
准备
1. xshell + 远程服务
2. idea + 本地代码
正文
一、新增远程调试配置
1. idea -> run -> edit configration

2.确定一个未被占用远程和本地占用的端口,开始编辑配置, 我这边用的jdk8

复制出来的参数:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8205
二、服务添加远程调试参数
登录服务器模块,
添加在第二步骤中复制的监听参数,然后重启服务, 手动启动jar, 或者
编辑启动脚本,
手动启动参数如下:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8205 -jar -Xmx512m -Xms512m web-4.2.jar
手动启动结果如下:

调整启动脚本示例如下:

手动启动会提示:
Listening for transport dt_socket at address: 8205
三、通过xshell将转发端口8205透传到本地
远程监听转发接口为8205,本地监听配置端口为8205,所以透传就是远程:8205 -> localhost:8205

四、开始远程调试
1.点击idea 的远程配置Debug 按钮,启动远程调试web服务,成功启动页面如下:

2.对指定接口打上断点, 点击页面,触发接口,就会自动进入idea中断点位置

TIPS:
问题1:idea添加配置后启动debug按钮无法点击
排查远程服务是否启动失败, 排查监听端口是否透传成功
问题2:启动debug后等待一段时间弹出握手失败报错,然后停止监听
Error running '82-12001' Unable to open debugger port (localhost:8205): java.io.IOException "handshake failed - connection prematurally closed"
去排查xshell透出的端口,是否跟远程转发端口一致。如上述步骤中所示:
web远程启动端口为12001,转发到8205端口, 此时我们需要将监听的8205端口传到本地localhost, 这样idea配置才能正常握手8025
问题3:调试断点无法进入
远程代码最好跟本地一致,以防出现断点无法进入情况
知识点:
idea添加远程配置时生成的JVM参数是用于配置Java远程调试的核心参数,下面我详细解释每个部分的含义:
完整参数:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8205
分解解释:
-
-agentlib:jdwp
-
表示加载JDWP(Java Debug Wire Protocol)代理库
-
这是Java调试的标准协议实现
-
-
transport=dt_socket
-
指定调试器与被调试JVM之间的通信传输方式
-
dt_socket表示使用socket网络通信(最常用)
-
替代选项: dt_shmem(共享内存,仅限本地调试)
-
-
server=y
-
定义JVM作为调试服务端(等待调试器连接)
-
如果设为 n,则JVM会主动连接调试器(较少使用)
-
-
suspend=n
-
控制JVM启动时是否暂停等待调试器连接
-
y:暂停,直到调试器连接(适合调试启动过程)
-
n:立即启动,调试器可以随时连接(生产环境推荐)
-
-
address=8205
-
指定调试端口号(这里是8205)
-
JDK 9+需要格式: address=*:8205(允许任意IP连接)
-
默认只接受本地连接,如需远程需明确指定IP
-