在無法訪問運(yùn)行中的實(shí)例時,調(diào)試一個java程序可能相當(dāng)麻煩;當(dāng)應(yīng)用程序在遠(yuǎn)程環(huán)境下運(yùn)行,并且不會在控制臺或日志文件中輸出任何結(jié)果時,調(diào)試工作變得更加困難。
JPDA是一組API集合,旨在幫助你調(diào)試Java代碼。J2SE自1.2.2版開始推出JPDA工具集,并在1.3.x版中將它直接包含在J2SE軟件包中。
JPDA并非一個應(yīng)用程序或調(diào)試工具,而是一組精心設(shè)計(jì)的接口與協(xié)議,了解這點(diǎn)很重要。Sun設(shè)計(jì)這一標(biāo)準(zhǔn)的目的是提供一個基礎(chǔ)構(gòu)架,以便第三方工具和調(diào)整器能夠高效利用它。還有許多利用JPDA的優(yōu)秀調(diào)試器和IDE,包括一些獲得廣泛認(rèn)可的工具,如Borland JBuilder、Oracle JDeveloper、IntelliJ IDEA、Sun NetBeans、IBM Eclipse等等。不過,Sun在它的傳統(tǒng)命令行式調(diào)試器jdb中提供了一個參考實(shí)例。Java 1.3重新編寫了jdb以支持JPDA。在本文中,我將討論JPDA技術(shù)及它的一些實(shí)際應(yīng)用。
工作原理
JPDA由三個接口構(gòu)成,這些接口為桌面系統(tǒng)的開發(fā)環(huán)境而設(shè)計(jì)。Java虛擬機(jī)工具接口(JVMTI)定義虛擬機(jī)(VM)在調(diào)試時必須提供的服務(wù)。(在Java 5.0中,JVMTI替代已被刪除的Java虛擬機(jī)調(diào)試接口)。Java調(diào)試線協(xié)議(JDWP)定義在調(diào)試過程和調(diào)試器前端之間傳輸?shù)男畔⒑驼埱蟮母袷健K鼒?zhí)行Java調(diào)試接口(JDI)。JDI定義用戶代碼級信息和請求。
JPDA概念將調(diào)試過程分為兩部分:被調(diào)試的程序(被調(diào)試者-debuggee)和JDI。JDI一般為一個調(diào)試應(yīng)用程序的用戶接口(或Java IDE的一部分)。被調(diào)試的應(yīng)用程序在后端運(yùn)行,而JDI在前端運(yùn)行。在前端與后端之間有一個通信通道運(yùn)行JDWP協(xié)議;因此,被調(diào)試程序與調(diào)試器可以位于同一個系統(tǒng)內(nèi),也可位于不同的系統(tǒng)中。
從開發(fā)者的角度,一個調(diào)試應(yīng)用程序可進(jìn)入任何JPDA層面。因?yàn)镴DI是最高層,也最輕易使用,我們推薦使用這個接口。假設(shè)一家公司用JDI開發(fā)了一個調(diào)試器。公司能夠把它用于參考實(shí)例中,它將自動與VM和Sun支持的平臺協(xié)同工作,因此大多數(shù)IDE供給商采用這種方式。還可以這樣,例如,參考實(shí)例在前端運(yùn)行,被調(diào)試者運(yùn)行另一家公司執(zhí)行JDWP(它可能運(yùn)行或忽略JVMTI)的VM。
一些調(diào)試器可能建立在較低層面之上,如JDWP(例如,假如Java沒有編寫前端)或JVMTI(針對需要低級功能的專用調(diào)試器)。
調(diào)試器的后端負(fù)責(zé)由調(diào)試器前端向被調(diào)試者VM傳輸請求,如“告訴我變量X的值”;它還負(fù)責(zé)向前端傳輸對這些請求(包括像到達(dá)斷點(diǎn)之類的預(yù)計(jì)事件)的響應(yīng)。后端與前端利用JDWP通過一個通信通道進(jìn)行通信。后端與被調(diào)試者VM利用JVMTI進(jìn)行通信。
通信通道連接調(diào)試器的前端與后端。可以認(rèn)為它由兩個裝置組成:一個連接器和一個傳送器。連接器是一個JDI對象,它在前端與后端建立連接;可能有三種類型的連接器:
傳送器是在前端和后端傳輸信息的基本裝置。在JPDA規(guī)范中沒有指定必須使用的傳送器裝置。可能的裝置包括:套接字、串行線路和共享內(nèi)存。但是,JDWP指定了流經(jīng)通道的連續(xù)化位流的格式與語義。許多IDE和調(diào)試器都支持兩種類型的傳送器(Sun的參考實(shí)例就是如此):共享內(nèi)存(假如被調(diào)試者和調(diào)試器位于同一系統(tǒng))和套接字(被調(diào)試者和調(diào)試器可位于任何地方,包括同一系統(tǒng))。
從J2SE 5.0開始,JPDA包括了服務(wù)提供器接口,答應(yīng)對連接器與傳送器實(shí)例進(jìn)行開發(fā)與配置。這些服務(wù)提供器服務(wù)接口答應(yīng)調(diào)試器和其它工具供給商開發(fā)新的連接器實(shí)例,并提供除Sun的套接字和共享內(nèi)存以外的其它傳送器裝置。
被調(diào)試者與調(diào)試器之間的通信以連接為導(dǎo)向。因此,一方必須作為服務(wù)器,收聽一個連接;另一方作為一個客戶端連接到服務(wù)器。JPDA答應(yīng)以調(diào)試應(yīng)用程序和目標(biāo)VM為服務(wù)器。
JPDA實(shí)際應(yīng)用
假如你需要使用套接字傳送器,在對應(yīng)的JVM中以dt_socket為名確定自變量的類型。假如被調(diào)試者和調(diào)試器位于同一機(jī)器之中,且運(yùn)行的是Windows系統(tǒng),你可以使用名為dt_schmem的共享內(nèi)存連接器。假如你希望用一個與JPDA兼容的調(diào)試器調(diào)試應(yīng)用程序,你應(yīng)在調(diào)試模式下運(yùn)行調(diào)試器,并提交其它參數(shù),如傳送器類型、主機(jī)名稱、端口號及其它信息。所有JPDA和調(diào)試參數(shù)必須在啟動應(yīng)用程序時作為自變量提交。
新聞熱點(diǎn)
疑難解答
圖片精選