【從零單排】Java遠程調試Remote Debug的二三事


問題

筆者對於本地調試已經有很多經驗了,一般流程是:在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中,配置如下:

debug_1.png

這里需要我們填的是Host和Port。

然后,就可以愉快地跑起來了~

需要注意的是,遠程調試由於需要網絡傳輸,如果服務器在國外,可能會非常慢。

參考


免責聲明!

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



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