1. 簡單理解
遠程調試就是用本地的代碼調試服務器上的代碼,稍微想想怎么能做到呢,肯定是本地和遠程服務上的虛擬機之間實現了相互通訊啊.。術語話一點,就是本地和遠程的JVM之間基於某種協議(debug協議)以套接字(socket) 的方式實現通信,從而實現在本地遠程調試服務端代碼的功能。既然是以套接字的方式,那可定就有服務端和客戶端的概念。這里不要思維定勢了,所謂服務端和客戶端是相對的,並不是說你部署服務的遠程端才叫服務端,實際上,只要你喜歡,你可以將本地IDE配置成服務端,讓遠程服務啟動后來主動連接本地,當然,通常的方式還是順勢思維,就把遠程配置為socket的服務端,監聽客戶端;而且連接的建立都是服務端先啟動后監聽特定端口,等待客戶端連接。
3. 命令環境
在運行java -jar命令來啟動的項目如內嵌服務器(如Jetty)或者只是簡單的運行 main 方法的場景下,想要遠程調試,也很簡單,就是在啟動時添加遠程調試相應的參數,下面為博主測試jar包環境下配置參數,完全可以拿去即用的——
java -Xdebug -Xrunjdwp:transport=dt_socket,server=n,address=9999,suspend=n -jar debug.jar
參數釋疑:
-XDebug 啟用調試模式;
-Xrunjdwp 加載JDWP的JPDA參考執行實例;
transport 用於在調試程序和 JVM 使用的進程之間通訊;
dt_socket 以套接字方式傳輸;
server=y/n 是否支持在server模式的虛擬機中(java -version可以查看到虛擬機默認運行模式,但布衣博主發現沒有此參數也不影響調試,此條存疑);
address=9999 調試服務端監聽的端口號,如果是作為調試客戶端,需要加上IP地址,形如: java -Xdebug -Xrunjdwp:transport=dt_socket,address=192.168.1.100:9999,suspend=n -jar debug.jar
suspend=y/n 是否在調試客戶端建立連接之后啟動 JVM,設置為y程序啟動會阻塞,直到客戶端建立連接程序才會正式啟動,為 n 程序直接啟動
本地 Idea配置和服務啟動如下圖:
本地和遠程服務建立調試連接后,如果代碼中打有斷點,在本地瀏覽器中訪問服務器地址,就可以愉快的在本地查看服務器端代碼的運行情況了——
注意:調試過程一定保證本地代碼和服務代碼的一致性,否則本地看到的運行軌跡會讓你莫名其妙。
附:eclipse中通過 run -> Debug Configurations -> Remote Java Application同樣的配置即可。
3.容器環境
這里還要說更常用以Tomcat作為服務器運行項目的情景,有些教程說要在啟動腳本如startup.sh或catalina.sh 中配置調試參數等等,其實不用的,真的不用的,因為我們的 Tom 貓已經把調試參數配置好了的,在它的啟動腳本catalina.sh(startup.sh最終也是調用該啟動腳本)中你可以看到如下腳本代碼:
所以,開啟遠程調試就很簡單了,直接 運行 ./catalina.sh jpda start 啟動,默認監聽 8000 端口即可開啟遠程,你可以通過 lsof -i:8000 或 netstat -lnp | grep 8000 等查看端口占用情況,也可以在Tomcat的啟動日志中查看監聽的端口。
啟動后,IDE端的配置就和博文上面演示的是一樣的了,自己愉快的玩耍吧。