Atitit.獲取swing?ui?按鈕控件的id?與名字?與JPDA?調(diào)試體系
?
1.?Swing?Inspector是一個(gè)Java?Swing/AWT用戶(hù)界面分析和調(diào)試工具,功能與firebug類(lèi)似,2
6.?JPDA(Java?Platform?Debugger?Architecture)是?Java?平臺(tái)調(diào)試體系結(jié)構(gòu)的縮寫(xiě)。4
6.1.?Java?調(diào)試接口的特點(diǎn)4
6.6.1.?Java?虛擬機(jī)工具接口(JVMTI)9
6.6.2.?Java?調(diào)試線協(xié)議(JDWP)9
?
1.?Swing?Inspector是一個(gè)Java?Swing/AWT用戶(hù)界面分析和調(diào)試工具,功能與firebug類(lèi)似,具有強(qiáng)大的Swing/AWT用戶(hù)界面分析和調(diào)試相關(guān)功能。?適用于從java?swing初級(jí)到高級(jí)的所有開(kāi)發(fā)人員,能夠快速定位問(wèn)題,UI快速調(diào)試,分析其他軟件界面的實(shí)現(xiàn)原理,能夠給開(kāi)發(fā)工作效率帶來(lái)大幅提升。
特點(diǎn):
1.?具備UI組件聯(lián)動(dòng)功能,在用戶(hù)界面中Ctrl+移動(dòng)鼠標(biāo)(Mac?OSX??+F12),可以在Swing?Inspector主界面中顯示對(duì)應(yīng)組件信息,并高亮當(dāng)前Component。
2.?可以在Swing?Inspector組件樹(shù)中聯(lián)動(dòng)到用戶(hù)界面,即雙向聯(lián)動(dòng),且不需要提供界面的源代碼。
3.?Applet支持,可以定位嵌入到任何網(wǎng)頁(yè)中的applet界面。
4.?強(qiáng)大的window捕獲功能,可以捕獲加載agent的jvm創(chuàng)建的所有Swing/AWT窗口(網(wǎng)頁(yè)中的applet,瀏覽器加載appet/webstart后啟動(dòng)的console窗口),模式對(duì)話框等。
5.?綠色,無(wú)需安裝,只需給java命令添加一行參數(shù),即可啟動(dòng)Swing?Inspector。
6.?支持所有的AWT/Swing程序,netbeans、visualvm等。
7.?強(qiáng)大的表達(dá)式支持,允許對(duì)選定組進(jìn)執(zhí)行表達(dá)式運(yùn)算,實(shí)時(shí)顯示計(jì)算結(jié)果,運(yùn)算結(jié)果支持屬性瀏覽和編輯。
8.?強(qiáng)大的Javascript支持功能,支持用javascript實(shí)時(shí)修改用戶(hù)界面中的組件,執(zhí)行腳本后立即生效。
9.?高性能,核心功能采用c/c++實(shí)現(xiàn),直接操縱jvm,對(duì)性能影響很小,主界面采用lazy機(jī)制,刷新組件時(shí)只更新可見(jiàn)viewer。屬性編輯器可直接修改選定的組件屬性,且直接生效。
10.?可以記錄組件添加到parent時(shí)的stacktrace,可以快速定位到相應(yīng)的代碼行。
11.?簡(jiǎn)單易用,快捷鍵與常用軟件一致(F5刷新、Alt+Left后退,Alt+Right前進(jìn)等),界面非常簡(jiǎn)潔、直觀,沒(méi)有學(xué)習(xí)成本。
12.?免費(fèi),為軟件行業(yè)發(fā)展盡一份力量是我們的宗旨
?
?
作者:: 老哇的爪子 Attilax 艾龍
轉(zhuǎn)載請(qǐng)注明來(lái)源:?
?
2.?類(lèi)似spylite?,firebug 3.?Eclipse??vm?param?
-agentpath:E:swing-inspector-windows-1.2.2_beta7Win32swing-inspector-agent.dll
4.?Cltr+f12顯示主界面?
5.?Ctrl+鼠標(biāo)找到控件?
?
?
Create?StackTrace?-?javax.swing.JLabel@7293796
????com.openbravo.pos.sales.JPanelTicket.initComponents(JPanelTicket.java:1226)
????com.openbravo.pos.sales.JPanelTicket.(JPanelTicket.java:187)
????com.openbravo.pos.sales.JPanelTicketSales.(JPanelTicketSales.java:18)
????aaaAtiDslParser.aaa33.main(aaa33.java:29)?
?
?
6.?javaagent的主要功能如下:·?可以在加載class文件之前做攔截,對(duì)字節(jié)碼做修改?
·?可以在運(yùn)行期對(duì)已加載類(lèi)的字節(jié)碼做變更,但是這種情況下會(huì)有很多的限制,后面會(huì)詳細(xì)說(shuō)?
·?還有其他一些小眾的功能?
o?獲取所有已經(jīng)加載過(guò)的類(lèi)?
o?獲取所有已經(jīng)初始化過(guò)的類(lèi)(執(zhí)行過(guò)clinit方法,是上面的一個(gè)子集)?
o?獲取某個(gè)對(duì)象的大小?
o?將某個(gè)jar加入到bootstrap?classpath里作為高優(yōu)先級(jí)被bootstrapClassloader加載?
o?將某個(gè)jar加入到classpath里供AppClassloard去加載?
o?設(shè)置某些native方法的前綴,主要在查找native方法的時(shí)候做規(guī)則匹配?
?
?
7.?JPDA(Java?Platform?Debugger?Architecture)是?Java?平臺(tái)調(diào)試體系結(jié)構(gòu)的縮寫(xiě)。通過(guò)?JPDA?提供的?API,開(kāi)發(fā)人員可以方便靈活的搭建?Java?調(diào)試應(yīng)用程序。?JPDA?主要由三個(gè)部分組成:Java?虛擬機(jī)工具接口(JVMTI)、Java?調(diào)試線協(xié)議(JDWP),以及?Java?調(diào)試接口(JDI)。
?
?
7.1.?Java?調(diào)試接口的特點(diǎn)
Java?語(yǔ)言是第一個(gè)使用虛擬機(jī)概念的流行的編程語(yǔ)言,正是因?yàn)樘摂M機(jī)的存在,使很多事情變得簡(jiǎn)單而輕松,掌握了虛擬機(jī),就掌握了內(nèi)存分配、線程管理、即時(shí)優(yōu)化等等運(yùn)行態(tài)。同樣的,Java?調(diào)試的本質(zhì),就是和虛擬機(jī)打交道,通過(guò)操作虛擬機(jī)來(lái)達(dá)到觀察調(diào)試我們自己代碼的目的。這個(gè)特點(diǎn)決定了?Java?調(diào)試接口和以前其他編程語(yǔ)言的巨大區(qū)別。
以?C/C++?的調(diào)試為例,目前比較流行的調(diào)試工具是?GDB?和微軟的?Visual?Studio?自帶的?debugger,在這種?debugger?中,首先,我們必須編譯一個(gè)“?debug?”模式的程序,這個(gè)會(huì)比實(shí)際的?release?模式程序大很多。其次,在調(diào)試過(guò)程中,debugger?將會(huì)深層接入程序的運(yùn)行,掌握和控制運(yùn)行態(tài)的一些信息,并將這些信息及時(shí)返回。這種介入對(duì)運(yùn)行的效率和內(nèi)存占用都有一定的需求。基于這些需求,這些?Debugger?本身事實(shí)上是提供了,或者說(shuō),創(chuàng)建和管理了一個(gè)運(yùn)行態(tài),因此他們的程序算法比較復(fù)雜,個(gè)頭都比較大。對(duì)于遠(yuǎn)端的調(diào)試,GDB?也沒(méi)有很好的默認(rèn)實(shí)現(xiàn),當(dāng)然,C/C++?在這方面也沒(méi)有特別大的需求。
?
?
而?Java?則不同,由于?Java?的運(yùn)行態(tài)已經(jīng)被虛擬機(jī)所很好地管理,因此作為?Java?的?Debugger?無(wú)需再自己創(chuàng)造一個(gè)可控的運(yùn)行態(tài),而僅僅需要去操作虛擬機(jī)就可以了。?Java?的?JPDA?就是一套為調(diào)試和優(yōu)化服務(wù)的虛擬機(jī)的操作工具,其中,JVMTI?是整合在虛擬機(jī)中的接口,JDWP?是一個(gè)通訊層,而?JDI?是前端為開(kāi)發(fā)人員準(zhǔn)備好的工具和運(yùn)行庫(kù)。
從構(gòu)架上說(shuō),我們可以把?JPDA?看作成是一個(gè)?C/S?體系結(jié)構(gòu)的應(yīng)用,在這個(gè)構(gòu)架下,我們可以方便地通過(guò)網(wǎng)絡(luò),在任意的地點(diǎn)調(diào)試另外一個(gè)虛擬機(jī)上的程序,這個(gè)就很好地解決了部署和測(cè)試的問(wèn)題,尤其滿(mǎn)足解決了很多網(wǎng)絡(luò)時(shí)代中的開(kāi)發(fā)應(yīng)用的需求。前端和后端的分離,也方便用戶(hù)開(kāi)發(fā)適合于自己的調(diào)試工具。
從效率上看,由于?Java?程序本身就是編譯成字節(jié)碼,運(yùn)行在虛擬機(jī)上的,因此調(diào)試前后的程序、內(nèi)存占用都不會(huì)有大變化(僅僅是啟動(dòng)一個(gè)?JDWP?所需要的內(nèi)存),任意程度都可以很好地調(diào)試,非常方便。而?JPDA?構(gòu)架下的幾個(gè)組成部分,JDWP?和?JDI?都比較小,主要的工作可以讓虛擬機(jī)自己完成。
從靈活性上,Java?調(diào)試工具是建立在強(qiáng)大的虛擬機(jī)上的,因此,很多前沿的應(yīng)用,比如動(dòng)態(tài)編譯運(yùn)行,字節(jié)碼的實(shí)時(shí)替換等等,都可以通過(guò)對(duì)虛擬機(jī)的改進(jìn)而得到實(shí)現(xiàn)。隨著虛擬機(jī)技術(shù)的逐步發(fā)展和深入,各種不同種類(lèi),不同應(yīng)用領(lǐng)域中虛擬機(jī)的出現(xiàn),各種強(qiáng)大的功能的加入,給我們的調(diào)試工具也帶來(lái)很多新的應(yīng)用。
總而言之,一個(gè)先天的,可控的運(yùn)行態(tài)給?Java?的調(diào)試工作,給?Java?調(diào)試接口帶來(lái)了極大的優(yōu)勢(shì)和便利。通過(guò)?JPDA?這個(gè)標(biāo)準(zhǔn),我們可以從虛擬機(jī)中得到我們所需要的信息,完成我們所希望的操作,更好地開(kāi)發(fā)我們的程序。
?
7.2.?JPDA?組成模塊
JPDA?定義了一個(gè)完整獨(dú)立的體系,它由三個(gè)相對(duì)獨(dú)立的層次共同組成,而且規(guī)定了它們?nèi)咧g的交互方式,或者說(shuō)定義了它們通信的接口。這三個(gè)層次由低到高分別是?Java?虛擬機(jī)工具接口(JVMTI),Java?調(diào)試線協(xié)議(JDWP)以及?Java?調(diào)試接口(JDI)。這三個(gè)模塊把調(diào)試過(guò)程分解成幾個(gè)很自然的概念:調(diào)試者(debugger)和被調(diào)試者(debuggee),以及他們中間的通信器。被調(diào)試者運(yùn)行于我們想調(diào)試的?Java?虛擬機(jī)之上,它可以通過(guò)?JVMTI?這個(gè)標(biāo)準(zhǔn)接口,監(jiān)控當(dāng)前虛擬機(jī)的信息;調(diào)試者定義了用戶(hù)可使用的調(diào)試接口,通過(guò)這些接口,用戶(hù)可以對(duì)被調(diào)試虛擬機(jī)發(fā)送調(diào)試命令,同時(shí)調(diào)試者接受并顯示調(diào)試結(jié)果。在調(diào)試者和被調(diào)試著之間,調(diào)試命令和調(diào)試結(jié)果,都是通過(guò)?JDWP?的通訊協(xié)議傳輸?shù)摹K械拿畋环庋b成?JDWP?命令包,通過(guò)傳輸層發(fā)送給被調(diào)試者,被調(diào)試者接收到?JDWP?命令包后,解析這個(gè)命令并轉(zhuǎn)化為?JVMTI?的調(diào)用,在被調(diào)試者上運(yùn)行。類(lèi)似的,JVMTI?的運(yùn)行結(jié)果,被格式化成?JDWP?數(shù)據(jù)包,發(fā)送給調(diào)試者并返回給?JDI?調(diào)用。而調(diào)試器開(kāi)發(fā)人員就是通過(guò)?JDI?得到數(shù)據(jù),發(fā)出指令。圖?2?展示了這個(gè)過(guò)程:
7.2.1.1.1.?圖?2.?JPDA?模塊層次
?
當(dāng)然,開(kāi)發(fā)人員完全可以不使用完整的三個(gè)層次,而是基于其中的某一個(gè)層次開(kāi)發(fā)自己的應(yīng)用。比如您完全可以?xún)H僅依靠通過(guò)?JVMTI?函數(shù)開(kāi)發(fā)一個(gè)調(diào)試工具,而不使用?JDWP?和?JDI,只使用自己的通訊和命令接口。當(dāng)然,除非是有特殊的需求,利用已有的實(shí)現(xiàn)會(huì)使您事半功倍,避免重復(fù)發(fā)明輪子。
這三個(gè)模塊我們會(huì)在后續(xù)文章中分別詳細(xì)介紹,這里我們簡(jiǎn)單介紹它們的主要功能:
?
7.3.?JVMTI?的簡(jiǎn)介
JVMTI(JVM?Tool?Interface)是?Java?虛擬機(jī)所提供的?native?編程接口,是?JVMPI(Java?Virtual?Machine?Profiler?Interface)和?JVMDI(Java?Virtual?Machine?Debug?Interface)的更新版本。從這個(gè)?API?的發(fā)展歷史軌跡中我們就可以知道,JVMTI?提供了可用于?debug?和?profiler?的接口;同時(shí),在?Java?5/6?中,虛擬機(jī)接口也增加了監(jiān)聽(tīng)(Monitoring),線程分析(Thread?analysis)以及覆蓋率分析(Coverage?Analysis)等功能。正是由于?JVMTI?的強(qiáng)大功能,它是實(shí)現(xiàn)?Java?調(diào)試器,以及其它?Java?運(yùn)行態(tài)測(cè)試與分析工具的基礎(chǔ)。
JVMTI?并不一定在所有的?Java?虛擬機(jī)上都有實(shí)現(xiàn),不同的虛擬機(jī)的實(shí)現(xiàn)也不盡相同。不過(guò)在一些主流的虛擬機(jī)中,比如?Sun?和?IBM,以及一些開(kāi)源的如?Apache?Harmony?DRLVM?中,都提供了標(biāo)準(zhǔn)?JVMTI?實(shí)現(xiàn)。
JVMTI?是一套本地代碼接口,因此使用?JVMTI?需要我們與?C/C++?以及?JNI?打交道。事實(shí)上,開(kāi)發(fā)時(shí)一般采用建立一個(gè)?Agent?的方式來(lái)使用?JVMTI,它使用?JVMTI?函數(shù),設(shè)置一些回調(diào)函數(shù),并從?Java?虛擬機(jī)中得到當(dāng)前的運(yùn)行態(tài)信息,并作出自己的判斷,最后還可能操作虛擬機(jī)的運(yùn)行態(tài)。把?Agent?編譯成一個(gè)動(dòng)態(tài)鏈接庫(kù)之后,我們就可以在?Java?程序啟動(dòng)的時(shí)候來(lái)加載它(啟動(dòng)加載模式),也可以在?Java?5?之后使用運(yùn)行時(shí)加載(活動(dòng)加載模式)。
·?-agentlib:agent-lib-name=options
·?-agentpath:path-to-agent=options
?
?
7.4.?Agent?的工作過(guò)程
7.4.1.?啟動(dòng)
Agent?是在?Java?虛擬機(jī)啟動(dòng)之時(shí)加載的,這個(gè)加載處于虛擬機(jī)初始化的早期,在這個(gè)時(shí)間點(diǎn)上:
·?所有的?Java?類(lèi)都未被初始化;
·?所有的對(duì)象實(shí)例都未被創(chuàng)建;
·?因而,沒(méi)有任何?Java?代碼被執(zhí)行;
但在這個(gè)時(shí)候,我們已經(jīng)可以:
·?操作?JVMTI?的?Capability?參數(shù);
·?使用系統(tǒng)參數(shù);
動(dòng)態(tài)庫(kù)被加載之后,虛擬機(jī)會(huì)先尋找一個(gè)?Agent?入口函數(shù):
JNIEXPORT?jint?JNICALL?Agent_OnLoad(JavaVM?*vm,?char?*options,?void?*reserved)
在這個(gè)函數(shù)中,虛擬機(jī)傳入了一個(gè)?JavaVM?指針,以及命令行的參數(shù)。通過(guò)?JavaVM,我們可以獲得?JVMTI?的指針,并獲得?JVMTI?函數(shù)的使用能力,所有的?JVMTI?函數(shù)都通過(guò)這個(gè)?jvmtiEnv?獲取,不同的虛擬機(jī)實(shí)現(xiàn)提供的函數(shù)細(xì)節(jié)可能不一樣,但是使用的方式是統(tǒng)一的。
jvmtiEnv?*jvmti;?
(*jvm)->GetEnv(jvm,?&jvmti,?JVMTI_VERSION_
7.5.?JVMTI?基本功能
JVMTI?的功能非常豐富,包含了虛擬機(jī)中線程、內(nèi)存?/?堆?/?棧,類(lèi)?/?方法?/?變量,事件?/?定時(shí)器處理等等?20?多類(lèi)功能,下面我們介紹一下,并舉一些簡(jiǎn)單列子。
7.5.1.?事件處理和回調(diào)函數(shù)
從上文我們知道,使用?JVMTI?一個(gè)基本的方式就是設(shè)置回調(diào)函數(shù),在某些事件發(fā)生的時(shí)候觸發(fā)并作出相應(yīng)的動(dòng)作。因此這一部分的功能非?;?,當(dāng)前版本的?JVMTI?提供了許多事件(Event)的回調(diào),包括虛擬機(jī)初始化、開(kāi)始運(yùn)行、結(jié)束,類(lèi)的加載,方法出入,線程始末等等。如果想對(duì)這些事件進(jìn)行處理,我們需要首先為該事件寫(xiě)一個(gè)函數(shù),然后在?jvmtiEventCallbacks?這個(gè)結(jié)構(gòu)中指定相應(yīng)的函數(shù)指針。比如,我們對(duì)線程啟動(dòng)感興趣,并寫(xiě)了一個(gè)?HandleThreadStart?函數(shù),那么我們需要在?Agent_OnLoad?函數(shù)里加入:
?
7.5.2.?內(nèi)存控制和對(duì)象獲取
內(nèi)存控制是一切運(yùn)行態(tài)的基本功能。?JVMTI?除了提供最簡(jiǎn)單的內(nèi)存申請(qǐng)和撤銷(xiāo)之外(這塊內(nèi)存不受?Java?堆管理,開(kāi)發(fā)人員需要自行進(jìn)行清理工作,不然會(huì)造成內(nèi)存泄漏),也提供了對(duì)?Java?堆的操作。眾所周知,Java?堆中存儲(chǔ)了?Java?的類(lèi)、對(duì)象和基本類(lèi)型(Primitive),通過(guò)對(duì)堆的操作,開(kāi)發(fā)人員可以很容易的查找任意的類(lèi)、對(duì)象,甚至可以強(qiáng)行執(zhí)行垃圾收集工作。?JVMTI?中對(duì)?Java?堆的操作與眾不同,它沒(méi)有提供一個(gè)直接獲取的方式(由此可見(jiàn),虛擬機(jī)對(duì)對(duì)象的管理并非是哈希表,而是某種樹(shù)?/?圖方式),而是使用一個(gè)迭代器(iterater)的方式遍歷:
7.5.3.?線程和鎖
線程是?Java?運(yùn)行態(tài)中非常重要的一個(gè)部分,在?JVMTI?中也提供了很多?API?進(jìn)行相應(yīng)的操作,包括查詢(xún)當(dāng)前線程狀態(tài),暫停,恢復(fù)或者終端線程,還可以對(duì)線程鎖進(jìn)行操作。開(kāi)發(fā)者可以獲得特定線程所擁有的鎖:
jvmtiError?GetOwnedMonitorInfo(jvmtiEnv*?env,?
????jthread?thread,?
????jint*?owned_monitor_count_ptr,?
????jobject**?owned_monitors_ptr)
也可以獲得當(dāng)前線程正在等待的鎖:
jvmtiError?GetCurrentContendedMonitor(jvmtiEnv*?env,?
????jthread?thread,?
????jobject*?monitor_ptr)
?
7.5.4.?調(diào)試功能
調(diào)試功能是?JVMTI?的基本功能之一,這主要包括了設(shè)置斷點(diǎn)、調(diào)試(step)等,在?JVMTI?里面,設(shè)置斷點(diǎn)的?API?本身很簡(jiǎn)單:
jvmtiError?SetBreakpoint(jvmtiEnv*?env,?
????jmethodID?method,?
????jlocation?location)
?
7.6.?主要部分
7.6.1.?Java?虛擬機(jī)工具接口(JVMTI)
JVMTI(Java?Virtual?Machine?Tool?Interface)即指?Java?虛擬機(jī)工具接口,它是一套由虛擬機(jī)直接提供的?native?接口,它處于整個(gè)?JPDA?體系的最底層,所有調(diào)試功能本質(zhì)上都需要通過(guò)?JVMTI?來(lái)提供。通過(guò)這些接口,開(kāi)發(fā)人員不僅調(diào)試在該虛擬機(jī)上運(yùn)行的?Java?程序,還能查看它們運(yùn)行的狀態(tài),設(shè)置回調(diào)函數(shù),控制某些環(huán)境變量,從而優(yōu)化程序性能。我們知道,JVMTI?的前身是?JVMDI?和?JVMPI,它們?cè)瓉?lái)分別被用于提供調(diào)試?Java?程序以及?Java?程序調(diào)節(jié)性能的功能。在?J2SE?5.0?之后?JDK?取代了?JVMDI?和?JVMPI?這兩套接口,JVMDI?在最新的?Java?SE?6?中已經(jīng)不提供支持,而?JVMPI?也計(jì)劃在?Java?SE?7?后被徹底取代。
7.6.2.?Java?調(diào)試線協(xié)議(JDWP)
JDWP(Java?Debug?Wire?Protocol)是一個(gè)為?Java?調(diào)試而設(shè)計(jì)的一個(gè)通訊交互協(xié)議,它定義了調(diào)試器和被調(diào)試程序之間傳遞的信息的格式。在?JPDA?體系中,作為前端(front-end)的調(diào)試者(debugger)進(jìn)程和后端(back-end)的被調(diào)試程序(debuggee)進(jìn)程之間的交互數(shù)據(jù)的格式就是由?JDWP?來(lái)描述的,它詳細(xì)完整地定義了請(qǐng)求命令、回應(yīng)數(shù)據(jù)和錯(cuò)誤代碼,保證了前端和后端的?JVMTI?和?JDI?的通信通暢。比如在?Sun?公司提供的實(shí)現(xiàn)中,它提供了一個(gè)名為?jdwp.dll(jdwp.so)的動(dòng)態(tài)鏈接庫(kù)文件,這個(gè)動(dòng)態(tài)庫(kù)文件實(shí)現(xiàn)了一個(gè)?Agent,它會(huì)負(fù)責(zé)解析前端發(fā)出的請(qǐng)求或者命令,并將其轉(zhuǎn)化為?JVMTI?調(diào)用,然后將?JVMTI?函數(shù)的返回值封裝成?JDWP?數(shù)據(jù)發(fā)還給后端。
另外,這里需要注意的是?JDWP?本身并不包括傳輸層的實(shí)現(xiàn),傳輸層需要獨(dú)立實(shí)現(xiàn),但是?JDWP?包括了和傳輸層交互的嚴(yán)格的定義,就是說(shuō),JDWP?協(xié)議雖然不規(guī)定我們是通過(guò)?EMS?還是快遞運(yùn)送貨物的,但是它規(guī)定了我們傳送的貨物的擺放的方式。在?Sun?公司提供的?JDK?中,在傳輸層上,它提供了?socket?方式,以及在?Windows?上的?shared?memory?方式。當(dāng)然,傳輸層本身無(wú)非就是本機(jī)內(nèi)進(jìn)程間通信方式和遠(yuǎn)端通信方式,用戶(hù)有興趣也可以按?JDWP?的標(biāo)準(zhǔn)自己實(shí)現(xiàn)。
7.6.3.?Java?調(diào)試接口(JDI)
JDI(Java?Debug?Interface)是三個(gè)模塊中最高層的接口,在多數(shù)的?JDK?中,它是由?Java?語(yǔ)言實(shí)現(xiàn)的。?JDI?由針對(duì)前端定義的接口組成,通過(guò)它,調(diào)試工具開(kāi)發(fā)人員就能通過(guò)前端虛擬機(jī)上的調(diào)試器來(lái)遠(yuǎn)程操控后端虛擬機(jī)上被調(diào)試程序的運(yùn)行,JDI?不僅能幫助開(kāi)發(fā)人員格式化?JDWP?數(shù)據(jù),而且還能為?JDWP?數(shù)據(jù)傳輸提供隊(duì)列、緩存等優(yōu)化服務(wù)。從理論上說(shuō),開(kāi)發(fā)人員只需使用?JDWP?和?JVMTI?即可支持跨平臺(tái)的遠(yuǎn)程調(diào)試,但是直接編寫(xiě)?JDWP?程序費(fèi)時(shí)費(fèi)力,而且效率不高。因此基于?Java?的?JDI?層的引入,簡(jiǎn)化了操作,提高了開(kāi)發(fā)人員開(kāi)發(fā)調(diào)試程序的效率。
表?1?總結(jié)了三個(gè)模塊的不同點(diǎn):
7.6.3.1.1.?表?1.?JPDA?層次比較
?
模塊 |
層次 |
編程語(yǔ)言 |
作用 |
JVMTI |
底層 |
C |
獲取及控制當(dāng)前虛擬機(jī)狀態(tài) |
JDWP |
中介層 |
C |
定義?JVMTI?和?JDI?交互的數(shù)據(jù)格式 |
JDI |
高層 |
Java |
提供?Java?API?來(lái)遠(yuǎn)程控制被調(diào)試虛擬機(jī) |
?
?
8.?找到源碼???this.m_jTotalEuros?=?new?JLabel();
????this.m_jLblTotalEuros1?=?new?JLabel();
this.m_jSubtotalEuros?=?new?JLabel();
?
?
參考
深入?Java?調(diào)試體系,第?2?部分??JVMTI?和?Agent?實(shí)現(xiàn).htm
JVM源碼分析之javaagent原理完全解讀.htm
?
本文摘自 :https://blog.51cto.com/a