遠程調試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)的那些事


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM