最近協助QA測試我們基于EJB開發的系統,由于應用程序在遠程環境下運行,并且在控制臺和日志文件中沒有輸出足夠的有用信息,導致調試工作很困難。這時發現了Sun的java平臺調試架構(Java Platform Debugger Architecture),它能夠對一個運行中的java應用程序進行全方位調試提供極大的幫助。
JPDA是一組接口與協議。JPDA主要由三個部分構成:
Ø
Java虛擬機工具接口(JVMTI)定義虛擬機(VM)在調試時必須提供的服務,包括調試信息(如棧信息)、調試行為(如客戶端設置一個斷點)和通知(如到達某個斷點時通知客戶端);
Ø Java調試線協議(JDWP)定義在調試過程和調試器前端之間傳輸的信息和請求的格式;
Ø Java調試接口(JDI)定義了調試者可以使用的調試接口,以方便與遠程的調試服務進行交互。
當虛擬機的調試服務運行時,虛擬機作為調試的服務提供端,監聽一個連接,而調試器通過該連接與虛擬機進行交互。調試器都支持兩種方式的連接:共享內存(被調試者和調試器位于同一系統)和 Socket連接(被調試者和調試器可位于任何地方,包括同一系統),如果使用socket鏈接,則在對應的JVM中以dt_socket為名確定自變量的類型。如果被調試者和調試器位于同一機器之中,且運行的是Windows系統,則可以使用名為dt_schmem的共享內存連接。
JVM參數設置:
Ø -Xdebug:
啟用調試。
Ø -Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]... :
加載JVM的JPDA參考實現庫。
Ø server(是”y”或否”n”):
如“server=y”,收到一個要依附的調試應用程序;如“server=n”,依附到指定地址的調試應用程序。
Ø address:
連接傳送地址。如果server=n,嘗試依附到這個地址調試應用程序;如server=y,收到這個地址的連接。
Ø timeout:
如果server=y,它以毫秒為單位指定等待調試器依附的時間;如server=n,它以毫秒為單位指定依附到調試器所用的時間。
Ø suspend:
如“是”,JVM延緩執行,直到調試器與被調試JVM建立連接。
將jvm參數添加至weblogic server的配置中即可開啟remote debug模式,如:
-Xdebug -Xnoagent -Djava.compiler=none
-Xrunjdwp:server=y,transport=dt_socket,suspend=n,address=35922
35922是server監聽的調試端口,可通過:env | grep WL_REMOTE_DEBUG_PORT 找出運行環境中weblogic的調試端口。
設置完成后,重啟weblogic,將會在啟動日志中看到信息:
Listening for transport dt_socket at address: 35922
Eclipse設置:
1、首先配置一個remote launch:

2、雙擊Remote Java Application

3、填充遠程主機的IP和之前設置的端口號

這時就可以在指定的project的代碼中設置斷點了,接下來激活你的debug操作,當程序運行至斷點處時將會停止下來進入debug。
推薦一篇深入講解JPDA的文章:《深入Java調試體系》,它將會使你對JPDA有更深入的認識。