引入:

上一篇文章主要分析JDWP层传输的数据包的格式,这篇文章我们主要关注于JDWP层是如何传输的。

分析:

传输的具体实现是根据各个JVM自己实现,但是他们有个共同点就是都是用C/C++实现的,并且都实现了jdwpTransport.h (和上篇一样的这个文件)。实现根据我们的知识可以得知是以dll文件(或者Unix平台下是so文件)的形式存在。因为我们从前面了解到,JDWP层有Agent负责在数据包和JVMTI的函数调用之间转换,所以顺理成章知道,传输层的DLL文件也必定会有一个onload方法,并且让Agent启动时候调用的。

分析1:Agent如何访问VM环境呢?

答案是通过环境指针(environment pointer), 该指针会在onload()方法中返回给Agent.这个环境指针的定义如下:

struct _jdwpTransportEnv;#ifdef __cplusplus
typedef _jdwpTransportEnv jdwpTransportEnv;...
struct _jdwpTransportEnv {const struct jdwpTransportNativeInterface_ *functions;

所以这里可以看出,环境指针本质就是拿到一组可以访问目标VM环境的native接口。

分析2:Agent启动时调用的onload()方法。

当Target VM加载了Agent之后,JDWP会根据参数去加载具体的JDWP的实现,Sun 的 JDK 在 Windows 提供 socket 和 share memory 两种传输方式,而在 Linux 上只有 socket 方式)。传输层实现的动态链接库实现必须暴露 jdwpTransport_OnLoad 接口,来对传输层初始化。

该方法签名如下:

JNIEXPORT jint JNICALL
jdwpTransport_OnLoad(JavaVM *jvm,jdwpTransportCallback *callback,jint version,jdwpTransportEnv** env);

从这里可以看出_OnLoad方法需要下面几个入参:

jvm: 它让Agent通过GetJavaVM方法来获取JVM信息。

callback:它是一个函数表的指针,传输层用它来进行内存的分配与释放。

version:它让Agent获得期望的JDWPTRANSPORT的版本。

然后返回值就是在第四个参数中,它就是我们想要的环境指针。

如果传输层初始化成功,那么_OnLoad方法就会返回JNI_OK,否则会返回对应的错误码。

分析3:jdwpTransport支持的方法概览。

因为jdwpTransport需要维系着Debugger和Target VM之间的关系,所以它有许多方法。我们从几大类来看。

分类1:用于管理连接

管理连接的方法其主要作用是用于建立和关闭到Debugger的连接。

a. Attach.它主要用于关联到Debugger,建立到Debugger之间的可信链路.

步骤1:连接到指定的地址

步骤2:连接成功,则通过交换 ”JDWP-Handshake"来确保到Debugger的连接的确被建立。

    /*  3 : Attach */jdwpTransportError (JNICALL *Attach)(jdwpTransportEnv* env,const char* address,jlong attach_timeout,jlong handshake_timeout);

从这里可以看出,除了环境指针外,它需要下面3个参数:

address: Debugger的地址和端口

attach_timeout:设置连接超时值,单位毫秒。如果设为0则说明永不超时。

handshake_timeout:设置握手超时值,单位毫秒。如果设为0则说明永不超时。

b.StartListening.它主要用于让传输器处于listen模式,这样它就可以监听来自Debugger的连接了。

  /*  4: StartListening */jdwpTransportError (JNICALL *StartListening)(jdwpTransportEnv* env,const char* address,char** actual_address);

除环境指针外,它还需要1个参数:

address:Debugger的地址和端口

actualAddress:返回值,返回传输器从address参数获得的真实字符串形式的地址。

c.StopListening.它主要用于让传输器离开listen模式,这样它就不再监听来自Debugger的连接了。

    /*  5: StopListening */jdwpTransportError (JNICALL *StopListening)(jdwpTransportEnv* env);

d.Accept.它主要用于建立来自Debugger的连接。

 /*  6: Accept */jdwpTransportError (JNICALL *Accept)(jdwpTransportEnv* env,jlong accept_timeout,jlong handshake_timeout);

e.IsOpen.它用于测试Debugger的连接是否开着。

   /*  7: IsOpen */jboolean (JNICALL *IsOpen)(jdwpTransportEnv* env);

f.Close.它用于关闭到Debugger的连接。

   /*  8: Close */jdwpTransportError (JNICALL *Close)(jdwpTransportEnv* env);

分类2:用于读来自Debugger的数据包和发送到Debugger的数据包。

a. ReadPacket. 它用于在连接开着的状态,从Debugger读取数据包。

  /*  9: ReadPacket */jdwpTransportError (JNICALL *ReadPacket)(jdwpTransportEnv* env,jdwpPacket *pkt);

需要注意的是,该方法只对数据包做长度校验,而不做完整性校验。

b.WritePacket.它用于在连接开着的状态,往Debugger写数据包。

  /*  10: Write Packet */jdwpTransportError (JNICALL *WritePacket)(jdwpTransportEnv* env,const jdwpPacket* pkt);

分类3:辅助功能。

a.GetLastError.它用于返回用字符串表示的上次错误。

    /*  11:  GetLastError */jdwpTransportError (JNICALL *GetLastError)(jdwpTransportEnv* env,char** error);

b.GetCapabilities.它用于返回JDWP传输器所有支持的能力。

 /*  2 : Get Capabilities */jdwpTransportError (JNICALL *GetCapabilities)(jdwpTransportEnv* env,JDWPTransportCapabilities *capabilities_ptr);

能力的启用和禁用是通过一组位图位来标示的。

整个传输器的架构如下:

转载于:https://blog.51cto.com/supercharles888/1587625

JPDA 架构研究4 - JDWP的传输器相关推荐

  1. JPDA 架构研究5 - Agent利用环境指针访问VM (内存管理篇)

    引入: 我们在前面说到JVMTI的客户端Agent,又提到Agent通过环境指针来访问VM.这里就来看看环境指针到底有多大的访问VM的能力. 分类1:内存管理 a.Allocate. 分配内存 jvm ...

  2. JPDA 架构研究14 - Agent利用环境指针访问VM(对象管理篇)

    引入: 上文讨论了Agent如何利用环境指针访问VM(管理类),这里讨论如何管理对象. 分类9:对象管理 a.GetObjectSize.  获取对象的大小, jvmtiError GetObject ...

  3. 蓝牙架构(6)—— 3 数据传输架构(3.1 核心传输载体)

    Vol 1 架构和术语概述 Part A 3 数据传输架构 Agenda: 3.1. 核心传输载体. 3.1.1. 帧化数据传输. 3.1.2 非帧化数据传输. 3.1.3 通信量载体的可靠性. Pa ...

  4. 城市地下综合管廊安全运营与智慧管控的分层架构研究

    安科瑞 李亚俊 1.引言 1833年,市政管线综合管廊在巴黎城市地下建成至今,经过百年来的探索.研究.改良和实践,法国.英国.德国.俄罗斯.日本.美国等发达国家的管廊规划建设与安全运维体系已经日臻完善 ...

  5. 全球及中国无线音频传输器行业发展前景与投资战略规划分析报告2022-2028年

    全球及中国无线音频传输器行业发展前景与投资战略规划分析报告2022-2028年 [出版机构]:鸿晟信合研究院 本文的2022-2028年的预测数据是基于过去几年的历史发展.行业专家观点.以及本文分析师 ...

  6. 无线 HDMI 视频传输器市场现状及未来发展趋势

    2021-2027中国无线 HDMI 视频传输器市场现状及未来发展趋势 无线视频 HDMI 发射器连接到视频或音频源设备. 通常这是机顶盒.蓝光.游戏机或其他媒体播放器. 然后发射器将无线信号从您的源 ...

  7. UART 和 USART 的区别 == 通用异步收发传输器 通用同步/异步串行接收/发送器

    UART 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器,是电脑硬件的一部分.它将要传输的资料在串 ...

  8. 企业架构研究总结(24)——TOGAF架构开发方法(ADM)之机会及解决方案阶段

    企业架构研究总结(24)--TOGAF架构开发方法(ADM)之机会及解决方案阶段 参考文章: (1)企业架构研究总结(24)--TOGAF架构开发方法(ADM)之机会及解决方案阶段 (2)https: ...

  9. UART(Universal Asynchronous Receiver/Transmitter,异步收发传输器)

    转自 http://baike.baidu.com/link?url=8hQCnHbH_IWvPK1Tp3RHqFgD9YtAzj-JDFQFaqbhY136q9EvODCZe8aQXW_u-gcJn ...

  10. 设计一个高性能三维渲染服务器,第一人称视角三维实景漫游系统渲染流水线架构研究.pdf...

    文档介绍: 同济大学 硕士学位论文 第一人称视角三维实景漫游系统渲染流水线架构研究 姓名:张岩 申请学位级别:硕士 专业:结构工程 指导教师:谢步瀛 20040301 关键词摘要计算机辅助三维实景漫游 ...

最新文章

  1. mysql blob取值_MySQL 数据类型:
  2. 面向对象——私有成员
  3. 056 CSRF跨站请求伪造
  4. 华为存储更换故障硬盘
  5. dry的原理_【面板制程刻蚀篇】史上最全Dry Etch 分类、工艺基本原理及良率剖析...
  6. caj格式如何转成pdf格式
  7. 帮忙写一篇关于消防化工指挥作战系统的设计报告
  8. 蓄水池抽样LeetCode
  9. win10黑屏Duilib资源加载失败
  10. Java数组中插入元素
  11. Collecting Bugs (DP期望)
  12. 多个并列的if条件句和if-elif的区别
  13. Codeup企业级代码管理平台,我们应该如何使用Codeup-阿里云
  14. LS1028 使用serdes mode 99BB软件修改方案
  15. ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理
  16. Caffe配置简明教程 ( Ubuntu 14.04 / CUDA 7.5 / cuDNN 5.1 )
  17. IDEA项目无法引用本地Class类,引用路径正确但报错标红
  18. 《ASP.NET Core 6框架揭秘》实例演示[19]:数据加解密与哈希
  19. fota 差分包_FOTA升级
  20. 产品方法论-如何做好竞品分析?

热门文章

  1. 给定一个数组 a[n], 输出b[n], 其中 b[i] = a[0]*a[1]...*a[i-1]*a[i+1]*....a[n]; 其中不能用除法 复杂度要求O(n)...
  2. UNIX Shell 编程(5)
  3. Heavyocity PUNISH Lite for Mac - 虚拟自动音频增强效果器
  4. Chrome浏览器Network面板http请求时间分析
  5. 消除代码中的 if-else/switch-case
  6. linux 一个读写锁的使用异常导致的故障
  7. jq 实现头像(气泡式浮动)
  8. javascript对象的浅拷贝、深拷贝和Object.assign方法浅析
  9. 886C. Petya and Catacombs#墓室探险(set集合)
  10. Android:PopupWindow、自定义菜单