Java 平台调试架构JPDA
轉(zhuǎn)載自??Java-JPDA 概述
JPDA:Java 平臺調(diào)試架構(gòu)(Java Platform Debugger Architecture)
它是 Java 虛擬機(jī)為調(diào)試和監(jiān)控虛擬機(jī)專門提供的一套接口。
?
一、JPDA
https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/
JPDA 由三個規(guī)范組成:JVMTI(JVM Tool Interface)、JDWP(Java Debug Wire Protocol)、JDI(Java Debug Interface)
這三個規(guī)范的層次由低到高分別是 JVMTI、JDWP、JDI
這三個規(guī)范把調(diào)試過程分解成幾個概念:調(diào)試者(debugger)、被調(diào)試者(debuggee)、以及它們中間的通信器
關(guān)系和作用如下圖:
JPDA 被抽象為三層實(shí)現(xiàn)。其中 JVMTI 是 JVM 對外暴露的接口。JDI 是實(shí)現(xiàn)了 JDWP 通信協(xié)議的客戶端,調(diào)試器通過它和 JVM 中被調(diào)試程序通信。
| 底層 | C | 獲取及控制當(dāng)前虛擬機(jī)狀態(tài) |
| 中介層 | C | 定義 JVMTI 和 JDI 交互的數(shù)據(jù)格式 |
| 高層 | Java | 提供 Java API 來遠(yuǎn)程控制被調(diào)試虛擬機(jī) |
?
二、JVMTI
https://juejin.im/post/5b029fcef265da0b83370da0
JVMTI(Java Virtual Machine Tool Interface)即指 Java 虛擬機(jī)工具接口,它是一套由虛擬機(jī)直接提供的 native 接口,它處于整個 JPDA 體系的最底層,所有調(diào)試功能本質(zhì)上都需要通過 JVMTI 來提供。
通過這些接口,開發(fā)人員不僅調(diào)試在該虛擬機(jī)上運(yùn)行的 Java 程序,還能查看它們運(yùn)行的狀態(tài),設(shè)置回調(diào)函數(shù),控制某些環(huán)境變量,從而優(yōu)化程序性能。
1.定義及原理
JVMTI 本質(zhì)上是在 JVM 內(nèi)部的許多事件進(jìn)行了埋點(diǎn)。通過這些埋點(diǎn)可以給外部提供當(dāng)前上下文的一些信息。甚至可以接受外部的命令來改變下一步的動作。
外部程序一般利用C/C++實(shí)現(xiàn)一個JVMTIAgent,在Agent里面注冊一些JVM事件的回調(diào)。當(dāng)事件發(fā)生時JVMTI調(diào)用這些回調(diào)方法。Agent可以在回調(diào)方法里面實(shí)現(xiàn)自己的邏輯。JVMTIAgent是以動態(tài)鏈接庫的形式被虛擬機(jī)加載的。
2.歷史
JVMTI 的前身是 JVMDI(Java Virtual Machine Profiler Interface) 和 JVMPI(Java Virtual Machine Debug Interface),它們原來分別被用于提供調(diào)試 Java 程序以及 Java 程序調(diào)節(jié)性能的功能。
在 J2SE 5.0 之后 JDK 取代了JVMDI 和 JVMPI 這兩套接口,JVMDI 在最新的 Java SE 6 中已經(jīng)不提供支持,而 JVMPI 也計劃在 Java SE 7 后被徹底取代。
3.功能
JVMTI 處于整個 JPDA 體系的最底層,所有調(diào)試功能本質(zhì)上都需要通過 JVMTI 來提供。
從大的方面來說,JVMTI 提供了可用于 debug 和 profiler 的接口;同時,在 Java 5/6 中,虛擬機(jī)接口也增加了監(jiān)聽(Monitoring),線程分析(Thread analysis)以及覆蓋率分析(Coverage Analysis)等功能。
從小的方面來說包含了虛擬機(jī)中線程、內(nèi)存、堆、棧、類、方法、變量,事件、定時器處理等等諸多功能。具體可以參考?oracle 的文檔。
通過這些接口,開發(fā)人員不僅可以調(diào)試在該虛擬機(jī)上運(yùn)行的 Java 程序,還能查看它們運(yùn)行的狀態(tài),設(shè)置回調(diào)函數(shù),控制某些環(huán)境變量,從而優(yōu)化程序性能。
4.實(shí)現(xiàn)
JVMTI 并不一定在所有的 Java 虛擬機(jī)上都有實(shí)現(xiàn),不同的虛擬機(jī)的實(shí)現(xiàn)也不盡相同。不過在一些主流的虛擬機(jī)中,比如 Sun 和 IBM,以及一些開源的如 Apache Harmony DRLVM 中,都提供了標(biāo)準(zhǔn) JVMTI 實(shí)現(xiàn)。
?
三、JDWP
JDWP(Java Debug Wire Protocol)是一個為 Java 調(diào)試而設(shè)計的一個通訊交互協(xié)議,它定義了調(diào)試器和被調(diào)試程序之間傳遞的信息的格式。
在 JPDA 體系中,作為前端(front-end)的調(diào)試者(debugger)進(jìn)程和后端(back-end)的被調(diào)試程序(debuggee)進(jìn)程之間的交互數(shù)據(jù)的格式就是由 JDWP 來描述的,它詳細(xì)完整地定義了請求命令、回應(yīng)數(shù)據(jù)和錯誤代碼,保證了前端和后端的 JVMTI 和 JDI 的通信通暢。
比如在 Sun 公司提供的實(shí)現(xiàn)中,它提供了一個名為 jdwp.dll(jdwp.so)的動態(tài)鏈接庫文件,這個動態(tài)庫文件實(shí)現(xiàn)了一個 Agent,它會負(fù)責(zé)解析前端發(fā)出的請求或者命令,并將其轉(zhuǎn)化為 JVMTI 調(diào)用,然后將 JVMTI 函數(shù)的返回值封裝成 JDWP 數(shù)據(jù)發(fā)還給后端。
另外,這里需要注意的是 JDWP 本身并不包括傳輸層的實(shí)現(xiàn),傳輸層需要獨(dú)立實(shí)現(xiàn),但是 JDWP 包括了和傳輸層交互的嚴(yán)格的定義,就是說,JDWP 協(xié)議雖然不規(guī)定我們是通過 EMS 還是快遞運(yùn)送貨物的,但是它規(guī)定了我們傳送的貨物的擺放的方式。
在 Sun 公司提供的 JDK 中,在傳輸層上,它提供了 socket 方式,以及在 Windows 上的 shared memory 方式。當(dāng)然,傳輸層本身無非就是本機(jī)內(nèi)進(jìn)程間通信方式和遠(yuǎn)端通信方式,用戶有興趣也可以按 JDWP 的標(biāo)準(zhǔn)自己實(shí)現(xiàn)。
?
四、JDI
JDI(Java Debug Interface)是三個模塊中最高層的接口,在多數(shù)的 JDK 中,它是由 Java 語言實(shí)現(xiàn)的。
JDI 由針對前端定義的接口組成,通過它,調(diào)試工具開發(fā)人員就能通過前端虛擬機(jī)上的調(diào)試器來遠(yuǎn)程操控后端虛擬機(jī)上被調(diào)試程序的運(yùn)行,JDI 不僅能幫助開發(fā)人員格式化 JDWP 數(shù)據(jù),而且還能為 JDWP 數(shù)據(jù)傳輸提供隊列、緩存等優(yōu)化服務(wù)。
從理論上說,開發(fā)人員只需使用 JDWP 和 JVMTI 即可支持跨平臺的遠(yuǎn)程調(diào)試,但是直接編寫 JDWP 程序費(fèi)時費(fèi)力,而且效率不高。因此基于 Java 的 JDI 層的引入,簡化了操作,提高了開發(fā)人員開發(fā)調(diào)試程序的效率。
?
https://blog.csdn.net/duqi_2009/article/details/94518203
https://www.ibm.com/developerworks/cn/java/j-lo-jpda1
總結(jié)
以上是生活随笔為你收集整理的Java 平台调试架构JPDA的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Faker换了好几台电脑了!T1凌晨空运
- 下一篇: 你想要的EXCEL表格操作都在这里怎么在