• java debug 在服务器上打断点 何苦


    java 远程debug

    远程debug即对远程部署的内容进行debug,例如我们部署的项目在线上出现问题了,而我们又不知道具体是哪里出现问题,我们就可以使用远程debug进行排查问题。

    java 实现远程debug常用的两种方式

    Java要实现远程debug其实很简单,只要我们在启动Java程序之前用相关参数对JPDA(Java Platform Debugger Architecture)做相应的配置即可。

    • Tomcat部署进行远程debug

    在服务器Tomcatxxxx/tomcat/bin/目录下文件catalina.sh添加配置内容

    CATALINA_OPTS="-Xdebug  -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8089"
    

    参数含义
    Xdebug:启用调试
    Xrunjdwp:加载JVM的JPDA参考实现库
    transport=dt_socket:Xrunjdwp参数(建立socket链接)
    server=y:Xrunjdwp参数(作为调试服务器运行)
    suspend=n:Xrunjdwp参数(是否在调试客户端建立连接之后启动 VM)
    address=8089:Xrunjdwp参数(在8089端口监听Socket连接)

    添加配置内容之后,将打包的war包放到webapps目录下,然后启动Tomcat


    可以从启动中看到以debug形式启动,如果不想在启动配置文件添加jvm参数也可以在启动时在shell脚本之后带上相关参数。

    • SpringBoot项目部署进行远程debug

    SpringBoot要进行远程调试其实也很简单,只要将要打包的jar启动时加上如下jvm参数即可

    -Xdebug  -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8090
    

    查看是否可连通

    在启动之后可以在服务器端可以通过netstat -ano | grep debug端口号查看是否可以连通进行debug

    netstat -ano | grep 8089
    

    如果是LISTENE状态,那说明可以连通,如果是 ESTABLISHED状态那说明已经有debug客户端握手连接,连通不了,这也是远程debug的一个缺点,只有一个客户端可以进行debug

    进行debug调试

    在debug环境准备好,和确定可以连接之后,我们就可以进行远程debug调试了,这里以Idea为例(Eclipse类似)进行配置调试。

    在Idea中的远程debug(Remote JVM Debug)中添加部署服务器的相关信息后打上断点即可进行debug。

    正常在本地打断点,debug启动就可以远程debug

    Java为什么可以进行远程调试,背后的原理

    • ava程序的执行过程- 分为以下几个步骤:
      • Java的文件
      • 编译生成的类文件(class文件)
      • JVM加载类文件
      • JVM运行类字节码文件
      • JVM翻译器翻译成各个机器认识的不同的机器码。
    • 远程调试原理

    Java 程序是运行在Java 虚拟机(JVM )上的,具有良好跨平台性,是因为Java程序统一以字节码的形式在JVM中运行,不同平台的虚拟机都统一使用这种相同的程序存储格式。因为都是类字节码文件,只要本地代码和远程服务器上的类文件相同,两个JVM通过调试协议进行通信(例如通过插座在同一个端口进行通信),另外需要注意的时,被调试的服务器需要开启调试模式,服务器端的代码和本地代码必须保持一致,则会造成断点无法进入的问题

    Java的调试器架构

    这个架构其实质还是JVM,只要确保本地的Java的源代码与目标应用程序一致,本地的Java的源码就可以用插座连接到远端的JVM,进而执行调试。因此,在这种插座连接模式(下文介绍)下,本地只需要有源码,本地的Java的应用程序根本不用启动。

    1. 传输方式,默认为Socket ;
    2. 套接字:MACOS,Linux的系统使用此种传输方式;
    3. 共享内存:WINDOWS系统使用此种传输方式。
    4. 调试模式,默认为Attach ;
      - Attach :此种模式下,调试服务端(被调试远程运行的机器)启动一个端口等待我们(调试客户端)去连接;
      - Socket :此种模式下,是我们(调试客户端)去监听一个端口,当调试服务端准备好了,就会进行连接。

    idea 配置属性说明补充

    1. idea的的服务的开启调试模式设置详细说明,

    CATALINA_OPTS="-Xdebug  -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8089"
    
    各参数解释
    -Xdebug:通知JVM工作在调试模式下
    -Xrunjdwp:通知JVM使用(java debug wire protocol)来运行调试环境。参数同时有一系列的调试选项:
    session:指定了调试数据的传送方式,dt_socket是指用SOCKET模式,另外dt_shmem指用共享内存方式,其中dt_shmem只适用于窗口平台.server 参数是指是否支持在服务器模式的虚拟机中
    onthrow:指明当产生该类型的异常时,JVM就会中断下来,进行调式该参数任选。
    release:指明当JVM被中断下来时,执行的可执行程序该参数可选
    suspend:指明:是否在调试客户端建立起来后,再执行 JVM。
    onuncaught(= y或n)指明出现未捕获的异常后,是否中断JVM的执行。
    1. IDEA设置远程属性说明,以下为谷歌翻译

  • 相关阅读:
    Mybatis获取插入记录的自增长ID
    mybatisGenerator 代码自动生成报错 Result Maps collection already contains value for BaseResultMap
    <c:if test="value ne, eq, lt, gt,...."> 用法
    大话设计模式之----状态模式
    php文件加锁 lock_sh ,lock_ex
    in_array 判断问题的疑惑解决。
    我是一只IT小小鸟观后感
    《世界是数字的》
    我是一只IT小小鸟
    解压缩
  • 原文地址:https://www.cnblogs.com/fuqian/p/16181985.html
Copyright © 2020-2023  润新知