Java远程调试保姆级教程

背景

测试环境报错,但很难排查到问题,可以像本地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

    分解解释:

    1. -agentlib:jdwp
      • 表示加载JDWP(Java Debug Wire Protocol)代理库
      • 这是Java调试的标准协议实现
    2. transport=dt_socket
      • 指定调试器与被调试JVM之间的通信传输方式
      • dt_socket表示使用socket网络通信(最常用)
      • 替代选项: dt_shmem(共享内存,仅限本地调试)
    3. server=y
      • 定义JVM作为调试服务端(等待调试器连接)
      • 如果设为 n,则JVM会主动连接调试器(较少使用)
    4. suspend=n
      • 控制JVM启动时是否暂停等待调试器连接
      • y:暂停,直到调试器连接(适合调试启动过程)
      • n:立即启动,调试器可以随时连接(生产环境推荐)
    5. address=8205
      • 指定调试端口号(这里是8205)
      • JDK 9+需要格式: address=*:8205(允许任意IP连接)
      • 默认只接受本地连接,如需远程需明确指定IP
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值