問題
筆者對於本地調試已經有很多經驗了,一般流程是:在IDE中設置斷點,配置參數,開始調試。這里的程序是跑在本地的機器上的。
而在實際開發或者生產環境中,應用都是部署在某個服務器上的,服務器上的機器性能更強大,而且可以起集群協同處理。
由於本地的機器的資源限制(筆者的台式機6核16G內存),對於大型應用來說遠遠不夠,某些時候為了跑UAT測試,必須把應用部署到遠端的服務器上,這個時候就需要遠程調試了。
命令
遠程調試和本地調試的思路是一致的,唯一的區別就是,需要讓IDE attach到遠端服務器的應用上去。
這里有個前提就是,在起JVM的時候,必須設置使其支持遠程調試,命令如下(JDK 1.5 +):
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6060
參數的含義如下:
- jdwp:加載JDWP的JPDA參考執行實例。
- transport:用於在調試程序和 VM 使用的進程之間通訊。
- dt_socket:套接字傳輸。
- server=y/n:VM 是否需要作為調試服務器執行。
- address=6060:調試服務器的端口號,客戶端用來連接服務器的端口號。
- suspend=y/n:是否在調試客戶端建立連接之后啟動 VM 。
對於JDK 1.4及以下的,參數略微有所區別。
一般來說,需要改動的是address,且需要確保該端口在服務器上是可用的,沒有沖突。
驗證
將應用正確在服務器上部署好之后,使用ps -aux | grep java
命令可以查看server上的Java應用,找到我們的應用如下:
/opt/sunjdk/jdk1.8.0u45_64/bin/java
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6060
-XX:+UseG1GC -Xmx140G -Xms5G -Xss10M -XX:NewSize=4G -Dcom.nomura.fixp.watchdog.timeout.minutes=30
-verbose:gc
-Xloggc:/home/user1/LOGS/app_log.log
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Dcom.sun.management.jmxremote.port=1785
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dlog4j.configuration=file:///home/user1/App/resources/log4j.properties
-cp path1:path2:path3 com.dummy.App
可以看到啟動參數中已經正確設置了遠程調試。
連接
接下來,我們就需要在IDE中,連接到這個端口。在IntelliJ中,配置如下:
這里需要我們填的是Host和Port。
然后,就可以愉快地跑起來了~
需要注意的是,遠程調試由於需要網絡傳輸,如果服務器在國外,可能會非常慢。