JPDA 架構研究17 - JDI概覽
標籤:jdwp jpda jvmti
引入:
前面用了很多篇幅來討論JVMTI和JDWP部分,現在終於來看最靠近使用者端部分了,JDI。
分析:
a. JDI的基礎知識
和JVMTI和JDWP不一樣的是,JDI提供了一組介面,這些介面是純JAVA編寫的。他們主要是給開發環境IDE用的,雖然調試器的實現可以直接利用JDWP或者JVMTI,但是多了這一層則可以從使用者的代碼層級來定義要發送的請求和擷取的資訊。
本質上,Eclipse的調試器與目標VM之間的雙向通訊如下:
調試器將使用者的操作轉化為調試命令,命令通過連結被發送到前端運行目標程式的虛擬機器上;然後,目標虛擬機器根據接受的命令做出相應的操作,將調試的結果發回給後端的調試器;最後,調試器可視化資料資訊反饋給使用者。
JDI介面定義在$JAVA_HOME/lib/tools.jar中,從宏觀上看,它分為5個大包。
包名
描述
com.sun.jdi
這是JDI的核心包,它提供了鏡像機制將目標虛擬機器上的所有資料、類型、域、方法、事件、狀態和資源,以及調試器發向目標虛擬機器的事件請求等都映射成 Mirror 對象
com.sun.jdi.connect
該包用於定義JDI到目標虛擬機器的串連
com.sun.jdi.connect.spi
該包用於定義開發TransportService(也就是前面我在JDWP層討論很深的傳輸器服務)所需要的必要的類和介面。
com.sun.jdi.event
該包定義了JDI事件和事件處理
com.sun.jdi.request
該包用於發送JDI事件然後在一定條件下發送。
b.JDI的具體實現
以Eclipse為例:
org.eclipse.jdt.debug 是 JDI 的一個完整實現,而org.eclipse.jdt.debug.ui 是 Eclipse 調試工具介面的實現。從包名上看,我們大體上把JDI 分成三個部分:
(1)資料模組。它負責調試器(Debugger)和目標虛擬機器上(Target VM)的資料建模。
(2)連結模組。它建立調試器(Debugger)與目標虛擬機器(Target VM)的溝通渠道。
(3)事件請求與處理模組。它提供調試器(Debugger)與目標虛擬機器(VM)之間的互動方式。
我們會在接下來的幾篇文章中從Eclipse的代碼層級來分析這些模組。
本文出自 “平行線的凝聚” 部落格,請務必保留此出處http://supercharles888.blog.51cto.com/609344/1587958
JPDA 架構研究17 - JDI概覽