Java Remote Debug(遠程調試)

新接手的項目採用的是Maven作爲編譯管理工具,項目內容則是按子模塊Module來劃分。由於模塊太多,且都比較大(基本上都能獨立運行並負責處理一方面的業務),並採用Socket來進行模塊之間的數據通信,結果就導致一個略顯臃腫的系統產生了。最重要的是,不知道maven的pom.xml文件出了什麼問題,Eclipse也一直無法成功加載部分重要模塊(以致最後切換到JetBrain IDEA(Open Source)——這也算是一點收穫),常用的調試方式也行不通了。過了好一段時間我才習慣,每次提交代碼前都要小心翼翼地檢查一遍。

昨天讓同事幫我做CodeReview,討論問題中,看着他演示一下Remote Debug。覺得很神奇,回來試了一下,又加了點資料,才發覺得我真的是Out了。以下內容是個簡單的筆記,關於在JetBrain IDEA中使用Remote Debug的方式。

要想Debug,首先得需要在編譯時打開debug選項,這樣生成的class文件才能支持debug過程。其次,RemoteDebug過程是在兩個不同的VM實例間進行了,這就得需要一個通信方式了。常用的是Socket了!因此設置中會涉及到一些端口設置的。

在啓動程序時,將以下參數選項添加到自定義的命令行中,程序就會以支持RemoteDeubg的方式啓動。
-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=2345
#

實例參考:

JVM_OPTS=”-server -Xss128k -XX:+UseParNewGC -XX:+HandlePromotionFailure -XX:+HeapDumpOnOutOfMemoryError”
DEBUG=”-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=2345”
JVM_OPTS=”JVMOPTS DEBUG”
JAVAHOME/bin/Java JVM_OPTS -cp $CP com.romebuild.Main
#
準備程序之後,再配置一下IDE,讓它去訪問遠程的VM了。過程相當簡單!

【Run】|【Edit Configuration】,選擇【Add New Configuration】|【Remote】,便生成了一個RemoteDebug配置,其中的參數不用修改,但需要設置目標VM實例所在的主機與監聽的端口。本例則爲localhost:2345了。再選擇與目標實例對應的模塊代碼就可以了。
#
點擊調試按鈕,IDEA就會連接到目標VM上去了,調試方法就不用多說了吧。下面來說明一下DEBUG選項參數的意思:

-XDebug 啓用調試
-Xrunjdwp 加載JDWP的JPDA參考執行實例。
transport 用於在調試程序和 VM 使用的進程之間通訊。
dt_socket 套接字傳輸。
server=y/n VM是否需要作爲調試服務器執行。
address=2345調試服務器監聽的端口號。
suspend=y/n 是否在調試客戶端建立連接之後啓動 VM 。

關於suspend多說一句,如果設置爲y,它會阻塞程序運行,直到有客戶端連接到對應的監聽端口(這裏是9527),程序才真正開始執行。我們有時候會抱怨程序一閃而過,還沒來得及在本地加載上代碼程序就執行完了,這種情況就可以使用suspend參數。
#
還有一個細節是-jar參數不能寫到-Xug參數前,像這樣無法啓用調試:
java -jar lib/Main.jar -Xdebug -Xrunjdwp:transport=dt_socket,address=9527,server=y,suspend=y

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章