Java 平台调试体系 JPDA

 Java 平台调试体系(Java Platform Debugger Architecture,JPDA)定义了一个完整独立的体系,它由三个相对独立的层次共同组成,而且规定了它们三者之间的交互方式,或者说定义了它们通信的接口。这三个层次由低到高分别是 Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP)以及 Java 调试接口(JDI)。
    JVMTI(Java Virtual Machine Tool Interface)即指 Java 虚拟机工具接口,它是一套由虚拟机直接提供的 native 接口,它处于整个 JPDA 体系的最底层,所有调试功能本质上都需要通过 JVMTI 来提供。
        前身是 JVMDI 和 JVMPI;
    JDWP(Java Debug Wire Protocol)是一个为 Java 调试而设计的一个通讯交互协议,它定义了调试器和被调试程序之间传递的信息的格式。在 JPDA 体系中,作为前端(front-end)的调试者(debugger)进程和后端(back-end)的被调试程序(debuggee)进程之间的交互数据的格式就是由 JDWP 来描述的,它详细完整地定义了请求命令、回应数据和错误代码,保证了前端和后端的 JVMTI 和 JDI 的通信通畅。
    JDI(Java Debug Interface)是三个模块中最高层的接口,在多数的 JDK 中,它是由 Java 语言实现的。 JDI 由针对前端定义的接口组成,通过它,调试工具开发人员就能通过前端虚拟机上的调试器来远程操控后端虚拟机上被调试程序的运行,JDI 不仅能帮助开发人员格式化 JDWP 数据,而且还能为 JDWP 数据传输提供队列、缓存等优化服务。
JPDA 定义了一套如何开发调试工具的接口和规范。
    JPDA 由三个独立的模块 JVMTI、JDWP、JDI 组成。
    调试者通过 JDI 发送接受调试命令。
    JDWP 定义调试者和被调试者交流数据的格式。
    JVMTI 可以控制当前虚拟机运行状态。


Java Agent:Java探针技术,用于修改或增强Java的字节码文件,许多热部署的插件和上线诊断工具就在此基础实现,此类程序和普通Jar包不同,必须依附于程序才能进行启动;
    程序运行前加载

    通过JVM参数 -javaagent:**.jar启动,程序启动的时候,会优先加载Java Agent,并执行其 premain方法,这个时候,其实大部分的类都还没有被加载,这个时候可以实现对新加载的类进行字节码修改,但是如果 premain方法执行失败或抛出异常,那么JVM会被中止,这是很致命的问题。
        Instrument是在整个虚拟机上挂钩子,相当于所有的类在加载之前都要执行,更适用于监控和控制虚拟机的行为;
    程序运行后加载

    程序启动之后,通过某种特定的手段加载Java Agent,这个特定的手段就是 VirtualMachine的 attach api,这个api其实是JVM进程之间的的沟通桥梁,底层通过socket进行通信,JVM A可以发送一些指令给JVM B,B收到指令之后,可以执行对应的逻辑,比如在命令行中经常使用的jstack、jcmd、jps等,很多都是基于这种机制实现的。

感觉是JDI的调用者,然后JDI格局JDWP协议去驱动JVMTI;    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值