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

2、雙擊Remote Java Application

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

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