开发者

Java远程调试保姆级教程(附详细图文)

目录
  • 背景
  • 准备
  • 一、新增远程调试配置
    • 1. idea -> run -> edit configration 
    • 2.确定一个未被占用远程和本地占用的端口,开始编辑配置, 我这边用的jdk8
  • 二、服务添加远程调试参数
    • python、通过xshell将转发端口8205透传到本地
      • 四、开始远程调试
        • 1.点击idea 的远程配置Debug 按钮,启动远程调试web服务,成功启动页面如下:
        • 2.对指定接口打上断点,  点击页面,触发接口,就会自动进入idea中断点位置
      • TIPS:
        • 问题1:idea添加配置后启动debug按钮无法点击
        • 问题2:启动debug后等待一段时间弹出握手失败报错,然后停止监听
        • 问题3:调试断点无法进入
      • 知识点:
        • 完整参数:
        • 分解解释:
      • 总结 

        背景

        测试环境报错,但很难排查到问题,可以像本地debug的方式来调试远程代码

        准备

        1. xshell + 远程服务

        2. idea + 本地代码

        一、新增远程调试配置

        1. idea -> run -> edit configration 

        Java远程调试保姆级教程(附详细图文)

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

        Java远程调试保姆级教程(附详细图文)

        复制出来的参数:

        -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

        手动启动结果如下:

        Java远程调试保姆级教程(附详细图文)

        调整启动脚本示例如下:

        Java远程调试保姆级教程(附详细图文)

        手动启动会提示:Listening for transport dt_socket at address: 8205

        三、通过xshell将转发端口8205透传到本地

        远程监听转发接口为8205,本地监听配置端口为8205,所以透传就是远程:8205 -> localhost:8205

        Java远程调试保姆级教程(附详细图文)

        四、开始远程调编程

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

        Java远程调试保姆级教程(附详细图文)

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

        Java远程调试保姆级教程(附详细图文)

        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"

        http://www.devze.com排查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之间的php通信传输方式

          • dt_socket表示使用socket网络通信(最常用)

          • 替代选项:dt_shmem(共享内存,仅限本地调试)

        • server=y

          • 定义JVM作为调试服务端(等待调试器连接)

          • 如果设为n,则JVM会主动连接调试器(较少使用)

        • suspend=n

          • 控制JVM启动时是否暂停等待调试器连接

          • y:暂停,直到调试器连接(js适合调试启动过程)

          • n:立即启动,调试器可以随时连接(生产环境推荐)

        • address=8205

          • 指定调试端口号(这里是8205)

          • JDK 9+需要格式:address=*:8205(允许任意IP连接)

          • 默认只接受本地连接,如需远程需明确指定IP

        总结 

        到此这篇关于Java远程调试保姆级教程的文章就介绍到这了,更多相关Java远程调试内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

        0

        上一篇:

        下一篇:

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        最新开发

        开发排行榜