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;
相關文章
相關標籤/搜索