java Remote Debug(遠端除錯)

Coding-lover發表於2016-02-02

新接手的專案採用的是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="$JVM_OPTS $DEBUG"
$JAVA_HOME/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

要遠端除錯maven2啟動的程式,例如mvn jetty:run,可以在啟動程式時執行命令:

export MAVEN_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=4000,server=y,suspend=y"

轉載自:Java Remote Debug(遠端除錯)

相關文章