Java-JPDA 概述


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

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

 

一、JPDA

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

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 中被調試程序通信。

 

二、JVMTI

https://juejin.im/post/5b029fcef265da0b83370da0

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

通過這些接口,開發人員不僅調試在該虛擬機上運行的 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 實現。

 

三、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 的標准自己實現。

 

四、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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM