Java-JPDA 概述

JPDA:Java 平臺調試架構(Java Platform Debugger Architecture)html

它是 Java 虛擬機爲調試和監控虛擬機專門提供的一套接口。前端

 

1、JPDA

https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/java

JPDA 由三個規範組成:JVMTI(JVM Tool Interface)、JDWP(Java Debug Wire Protocol)、JDI(Java Debug Interface)編程

這三個規範的層次由低到高分別是 JVMTI、JDWP、JDI後端

這三個規範把調試過程分解成幾個概念:調試者(debugger)、被調試者(debuggee)、以及它們中間的通訊器緩存

關係和做用以下圖:架構

JPDA 被抽象爲三層實現。其中 JVMTI 是 JVM 對外暴露的接口。JDI 是實現了 JDWP 通訊協議的客戶端,調試器經過它和 JVM 中被調試程序通訊。oracle

 

2、JVMTI

http://www.javashuo.com/article/p-fatlsrpl-hb.htmljvm

JVMTI(Java Virtual Machine Tool Interface)即指 Java 虛擬機工具接口,它是一套由虛擬機直接提供的 native 接口,它處於整個 JPDA 體系的最底層,全部調試功能本質上都須要經過 JVMTI 來提供。socket

經過這些接口,開發人員不只調試在該虛擬機上運行的 Java 程序,還能查看它們運行的狀態,設置回調函數,控制某些環境變量,從而優化程序性能。

1.定義及原理

JVMTI 本質上是在 JVM 內部的許多事件進行了埋點。經過這些埋點能夠給外部提供當前上下文的一些信息。甚至能夠接受外部的命令來改變下一步的動做。

外部程序通常利用C/C++實現一個JVMTIAgent,在Agent裏面註冊一些JVM事件的回調。當事件發生時JVMTI調用這些回調方法。Agent能夠在回調方法裏面實現本身的邏輯。JVMTIAgent是以動態連接庫的形式被虛擬機加載的。

2.歷史

JVMTI 的前身是 JVMDI(Java Virtual Machine Profiler Interface) 和 JVMPI(Java Virtual Machine Debug Interface),它們原來分別被用於提供調試 Java 程序以及 Java 程序調節性能的功能。

在 J2SE 5.0 以後 JDK 取代了JVMDI 和 JVMPI 這兩套接口,JVMDI 在最新的 Java SE 6 中已經不提供支持,而 JVMPI 也計劃在 Java SE 7 後被完全取代。

3.功能

JVMTI 處於整個 JPDA 體系的最底層,全部調試功能本質上都須要經過 JVMTI 來提供。

從大的方面來講,JVMTI 提供了可用於 debug 和 profiler 的接口;同時,在 Java 5/6 中,虛擬機接口也增長了監聽(Monitoring),線程分析(Thread analysis)以及覆蓋率分析(Coverage Analysis)等功能。

從小的方面來講包含了虛擬機中線程、內存、堆、棧、類、方法、變量,事件、定時器處理等等諸多功能。具體能夠參考 oracle 的文檔

經過這些接口,開發人員不只能夠調試在該虛擬機上運行的 Java 程序,還能查看它們運行的狀態,設置回調函數,控制某些環境變量,從而優化程序性能。

4.實現

JVMTI 並不必定在全部的 Java 虛擬機上都有實現,不一樣的虛擬機的實現也不盡相同。不過在一些主流的虛擬機中,好比 Sun 和 IBM,以及一些開源的如 Apache Harmony DRLVM 中,都提供了標準 JVMTI 實現。

 

3、JDWP

JDWP(Java Debug Wire Protocol)是一個爲 Java 調試而設計的一個通信交互協議,它定義了調試器和被調試程序之間傳遞的信息的格式。

在 JPDA 體系中,做爲前端(front-end)的調試者(debugger)進程和後端(back-end)的被調試程序(debuggee)進程之間的交互數據的格式就是由 JDWP 來描述的,它詳細完整地定義了請求命令、迴應數據和錯誤代碼,保證了前端和後端的 JVMTI 和 JDI 的通訊通暢。

好比在 Sun 公司提供的實現中,它提供了一個名爲 jdwp.dll(jdwp.so)的動態連接庫文件,這個動態庫文件實現了一個 Agent,它會負責解析前端發出的請求或者命令,並將其轉化爲 JVMTI 調用,而後將 JVMTI 函數的返回值封裝成 JDWP 數據發還給後端。

另外,這裏須要注意的是 JDWP 自己並不包括傳輸層的實現,傳輸層須要獨立實現,可是 JDWP 包括了和傳輸層交互的嚴格的定義,就是說,JDWP 協議雖然不規定咱們是經過 EMS 仍是快遞運送貨物的,可是它規定了咱們傳送的貨物的擺放的方式。

在 Sun 公司提供的 JDK 中,在傳輸層上,它提供了 socket 方式,以及在 Windows 上的 shared memory 方式。固然,傳輸層自己無非就是本機內進程間通訊方式和遠端通訊方式,用戶有興趣也能夠按 JDWP 的標準本身實現。

 

4、JDI

JDI(Java Debug Interface)是三個模塊中最高層的接口,在多數的 JDK 中,它是由 Java 語言實現的。

JDI 由針對前端定義的接口組成,經過它,調試工具開發人員就能經過前端虛擬機上的調試器來遠程操控後端虛擬機上被調試程序的運行,JDI 不只能幫助開發人員格式化 JDWP 數據,並且還能爲 JDWP 數據傳輸提供隊列、緩存等優化服務。

從理論上說,開發人員只需使用 JDWP 和 JVMTI 便可支持跨平臺的遠程調試,可是直接編寫 JDWP 程序費時費力,並且效率不高。所以基於 Java 的 JDI 層的引入,簡化了操做,提升了開發人員開發調試程序的效率。

 


https://blog.csdn.net/duqi_2009/article/details/94518203

https://www.ibm.com/developerworks/cn/java/j-lo-jpda1

相關文章
相關標籤/搜索