最近協助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>]...

加載JVMJPDA參考實現庫。

Ø         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有更深入的認識。