遠程調試Spring項目

服務端啓動:

啓動jar包:

通常啓動:java

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

遠程調試啓動:git

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

address是項目啓動之後對外提供的調試端口github

複雜的demo:web

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包:

設置環境變量spring

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

而後能夠直接命令行啓動tomcat便可。shell


若是是內嵌tomcat的話,上面的方法就不行json

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

固然這樣有點做弊,由於跟上面的命令本質是同樣的。api

環境變量只對tomcat/weblogic等Web服務器中間件有效,以「java -cp [*.jar] test.Main」方式運行的不會去讀取.tomcat

使用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)的那些事

相關文章
相關標籤/搜索