JPDA 架构研究3 - JDWP层的数据包

引入:异步

如今咱们把目光转到JDWP层(它的全称是Java Debug Wire Protocol。从"Wire"这词就能够看出,它主要是起到"连线”的做用)。首先咱们从JDWP层的数据包讲起。源码在JDK中很容易找到,它定义$JAVA_HOME/include/jdwpTransport.h 头文件中。
ide


分析:spa

Part 1: 握手过程 (handshake )调试

握手包发生在Debugger(JDI端)和Target VM(JVMTI端)的传输层链接创建,而且在发送任何实际数据报以前完成的。它过程以下:队列

a. Debugger会发送14个字节的握手请求到Target VM,这个包的内容是14字节的ASCII字符串 “JDWP-Handshake”事件

b. Target VM会返回14个字节的握手响应到Debugger,其内容也是14字节的ASCII字符串,和刚才同样,“JDWP-Handshake"文档

这样的主要做用是为了确保 Debugger和Target VM之间通讯正常。字符串


Part2:发送具体调试请求和得到响应阶段:命令包(Command Packet)和响应包(Reply Packet)
get

从许多文档中, 我归纳了JDWP层包的一些特色:cmd

(1)包是无状态的

(2)命令包能够经过Debugger或者Target VM来发送。

对于从Debugger发送的命令包来讲,它主要能够发送请求消息或者控制程序执行。

对于从Target VM发送的命令包来讲,它可通知Debugger一些Target VM中的事件好比断点或者异常。

(3)响应包

响应包用于对于某命令包的响应,它总用于返回命令的成功或失败,而且能够携带命令包中包含的数据。

对于从Debugger发送的命令包,通常总会有响应包。

对于从Target VM发送的命令包,无须要响应包。

(4)JDWP平台对于数据包的发送是异步的,各个命令/响应包之间无顺序概念。命令包和对应的响应包经过ID来配对识别。


命令包的定义以下:

typedef struct {
    jint len;                  //命令包的长度:4字节,它是整个包的长度
    jint id;                   //命令包的ID: 4字节,用于表示命令包和对应响应包的配对,正由于此机制才可让包是异步传输的。
    jbyte flags;           //命令包的标志位:1字节,用于定义该命令如何进队列/处理或者被打标记
    jbyte cmdSet;      //命令包的命令集:1字节,用于分组该命令 
                                //(0-63:表示Debugger往Target VM发送的命令)
                                // (64-127: 表示Target VM往Debugger发送的命令)
                                //(128-256: Vendor自定义命令)
    jbyte cmd;          //命令包中的命令:1字节
    jbyte *data;         //命令包中携带的数据
} jdwpCmdPacket;

响应包的定义以下:

typedef struct {
    jint len;                  //响应包的长度: 4字节
    jint id;                    //响应包的ID: 4字节,用于表示命令包和对应响应包的配对,正由于此机制才可让包是异步传输的。
    jbyte flags;            //响应包的标志位:1字节,用于定义该命令如何进队列/处理或者被打标记
    jshort errorCode;  //响应包中的错误码:2字节,其中0表示成功,非0表示某种错误码,通常错误码会映射到JVMTI的返回码。
    jbyte *data;           //响应包中携带的数据
} jdwpReplyPacket;


补充说明:

(1)若是接收端接受到的命令包,其中携带的命令集或者命令是规范中未定义的,那么响应包的errorCode会被定义为NOT_IMPLEMENTED.

(2)ErrorCode定义以下:

typedef enum {
    JDWPTRANSPORT_ERROR_NONE = 0,
    JDWPTRANSPORT_ERROR_ILLEGAL_ARGUMENT = 103,
    JDWPTRANSPORT_ERROR_OUT_OF_MEMORY = 110,
    JDWPTRANSPORT_ERROR_INTERNAL = 113,
    JDWPTRANSPORT_ERROR_ILLEGAL_STATE = 201,
    JDWPTRANSPORT_ERROR_IO_ERROR = 202,
    JDWPTRANSPORT_ERROR_TIMEOUT = 203,
    JDWPTRANSPORT_ERROR_MSG_NOT_AVAILABLE = 204
} jdwpTransportError;
相关文章
相关标签/搜索