zoukankan      html  css  js  c++  java
  • 远程调试Spring项目

    服务端启动:

    启动jar包:

    一般启动:

    java -jar -Dserver.port=8070 huishi-api.jar
    

    远程调试启动:

    java -jar  -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 huishi-api.jar
    

    address是项目启动以后对外提供的调试端口

    复杂的demo:

    java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Xms4096m -Xmx4096m -Xmn512m -Xss256k -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump.hprof /data/dubbo/app/huishi-api.jar --server.port=8080 --dubbo.port=28080 --server.tomcat.basedir=/data/dubbo/cache/esmart-assign_8080 --log.home=/data/dubbo/logs/esmart-assign_8080 --log.level=info --log.stdout=0 --ecej.ops.port=80 --ecej.ops.iswitch=1 --jmx.rmi.port=18080
    

    使用环境变量参数调试jar包:

    设置环境变量

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

    然后可以直接命令行启动tomcat即可。


    如果是内嵌tomcat的话,上面的方法就不行

     set JAVA_OPTS= -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
     
     java -jar %JAVA_OPTS% huishi-api.jar
    

    当然这样有点作弊,因为跟上面的命令本质是一样的。

    环境变量只对tomcat/weblogic等Web服务器中间件有效,以“java -cp [*.jar] test.Main”方式运行的不会去读取.

    使用mvnDebug启动SpringMVC项目:

    mvnDebug -DskipTests tomcat7:run -Pirm-web -Pdev
    

    可以查看maven安装包内的bin内的mvnDebug.bat

    @set MAVEN_DEBUG_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
    
    • Xdebug : 启动debug模式
    • Xrunjdwp:启动调试协议JDWP,全称是Java Debug Wire Protocol,它定义了JPDA front-end和JPDA back-end之间通讯信息的二进制格式。这里的通讯信息主要包括两种:调试器发送给JVM的请求信息和JVM发送给调试器的调试信息。有如下子项:
      • transport:JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。
      • server:y/n 该jvm是被调试者还是调试器
      • suspend:y/n 是否等待外部调试器的连接,如jetty启动时候,是否等待eclipse的远程连接后在进行jetty的初始化工作。在调试web容器的时候用的很多
      • address:监听端口

    使用mvn启动:

    设置MAVEN_DEBUG_OPTS环境变量

    set MAVEN_DEBUG_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
    

    再使用maven插件spring-boot启动时,可以用

    mvn spring-boot:run -Dspring-boot.run.profiles=dev
    

    使用Tomcat,非嵌入式启动:

    这里有多种方法可以做到,根据tomcat所运行的操作系统而有些微的不同。但是不管用哪种方法,这些配置的背后都做了同一件事:传递特定的启动参数给 JVM,让它启用远程调试(remote debugging)。
    JVM 激活远程调试的启动参数有 JPDA_OPTS, CATALINA_OPTS 和 JAVA_OPTS。其中 JAVA_OPTS 是通常不建议使用的, 因为基于 JAVA_OPTS 的参数设定会暴露给所有的 JVM 应用, 而 CATALINA_OPTS 定义的设定值限制在Tomcat 内。

    可以在~/bin/catalina.bat头部写入或者新建setenv.bat文件

    在 setenv.bat 文件中写入:

    set CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,address=1043,server=y,suspend=n"
    

    如果运行在Linux上, setenv.sh 中写入:

    export CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,address=1043,server=y,suspend=n"
    

    当然上面的设置也可以直接放到 catalina.sh (catalina.bat )内,但是有个 setenv.* 额外的配置文件一直是最佳选择, tomcat会自动读取。

    要注意的是, 有些人会碰到过用另一个配置方法来启用远程调试:

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

    -Xdebug and -Xrunjdw 与我们上面推荐的设置不同之处在于, 它是一种旧方式,适用于JVM 小于 JAVA 5.0 的版本(包括5.0), 而 agentlib:jdwp适用于 JAVA 5.0 和以后版本。

    最后通过下面的命令行启动tomcat,即可完成tomcat启用远程调试啦。

    startup.sh
    或者
    catalina.sh start
    
    startup.bat
    或者
    catalina.bat start
    

    如果是window服务的话,必须要在属性中加启动参数,不然的话,是没有效果的。

    客户端设置:

    IDEA设置:

    CommandLine会根据右边选择jdk版本自动生成,直接复制到命令里面就可以

    手动配置Host,Port即可。

    VsCode设置:

    远程调试配置:

    launch.json设置:

    {
        "type": "java",
        "name": "Debug (Attach)",
        "request": "attach",
        "hostName": "localhost",
        "port": 8000
    }
    

    在服务端启动以后,启动vs进行调试

    服务端启动,远程调试一步到位:

    .vscode/tasks.json

    {
        // See https://go.microsoft.com/fwlink/?LinkId=733558
        // for the documentation about the tasks.json format
        "version": "2.0.0",
        "tasks": [
            {
                "label": "myMavenDebugCommand",
                "type": "shell",
                "command": "mvnDebug spring-boot:run",
                "group": "build"
            }
        ]
    }
    

    launch.json

    {
        "type": "java",
        "name": "Debug (Attach)",
        "request": "attach",
        "hostName": "localhost",
        "port": 8008,
        "preLaunchTask": "myMavenDebugCommand" // <--It will be executed first.
    }
    

    参考:

    Intellij IDEA基于Springboot的远程调试

    IntelliJ IDEA 远程调试 Tomcat

    Support for mvnDebug

    maven工程开启jetty调试

    Java Remote Debug(远程调试)

    Java远程调试(Remote Debugging)的那些事

  • 相关阅读:
    docker指令汇总
    springboot(八) 嵌入式Servlet容器自动配置原理和容器启动原理
    RabbitMQ 消息确认机制
    RabbitMQ 最常用的三大模式
    RabbitMQ 核心概念
    RabbitMQ 之简单队列
    Spring 详解(三)------- SpringMVC拦截器使用
    slf4j 搭配 log4j2 处理日志
    Spring 详解(二)------- AOP关键概念以及两种实现方式
    Spring 详解(一)------- AOP前序
  • 原文地址:https://www.cnblogs.com/hongdada/p/10138723.html
Copyright © 2011-2022 走看看