🔥
Caster 開發日誌
  • Java
    • JVM Performance Tool
      • Java Debug Wire Protocol (JDWP) 的詳細介紹
      • JConsole 詳細介紹
    • Spring Boot
      • Spring Security
      • Spring Boot Admin
      • Spring Event
      • Spring AOP
      • Spring Boot JUnit 5
      • Apache Dubbo
    • Reflect 應用
    • ELK + F 建構
    • Socket.IO
    • OCR - 光學字元辨識
    • 讀取JAR resource文件
    • LocalTime & MySQL時間精度
    • Gradle multi module
    • MyBatis-Plus
    • Java Date operation
    • Java IP to Long
    • Apache Commons lang3 應用
      • Function 應用
    • Cloud Platform
      • Amazon S3
        • SDK V1
          • Bucket
        • SDK V2
          • Bucket
      • Google Cloud Platform
      • Azure Cloud
        • Storage
      • OVHcloud
        • Config
    • SSL/TLS工具
    • Util 工具
      • Jackson Json工具
      • Charles應用
      • JMeter – Performing Distributed Load Testing with Docker
    • Redis
      • Stream
      • Redisson 分布式鎖機制
      • Create Redis Cluster Using Docker
      • List Operations
    • Java 8
      • method & constructor Reference
      • CompletableFuture
      • FunctionInterface
      • Stream 應用
      • 繁簡轉換 - 簡易調整
    • MySQL
      • 建立測試用 流水號Table
      • SQL 效能調校 - Explain
      • SQL 效能調校 - Partition
      • 排程 - Event
    • Apache ShardingSphere
  • Kubernetes
    • 初入江湖(K8S)
    • 零中斷服務滾動更新
    • Kubernetes DNS
    • Ingress & Ingress Controller 教學
    • Ingress TLS Easy setup
  • 指令集
  • Telegram
  • SourceTree
    • 踩坑紀錄(ㄧ) - Git Flow
    • 踩坑紀錄(二) - 修改檔名
  • 專案統計
    • Robot
    • Recharge
  • GitHub
    • Actions
  • GitLab
    • 介紹 GitLab
    • 使用 Docker 自架 GitLab
    • 簡介 GitLab CI/CD
      • GitLab Runner 詳細介紹與設定方式
Powered by GitBook
On this page
  1. Java
  2. JVM Performance Tool

Java Debug Wire Protocol (JDWP) 的詳細介紹

Java Debug Wire Protocol (JDWP) 是 Java 平台中用於支持遠程調試的低層協議。它定義了調試器和被調試的 Java 虛擬機(JVM)之間的通信格式,使得調試器可以通過網絡或本地連接與 JVM 進行交互。JDWP 是 Java Platform Debugger Architecture (JPDA) 的組成部分,JPDA 是 Java 的調試架構,包含三個層次:JDWP、JVM Tool Interface (JVMTI) 和 Java Debug Interface (JDI)。

JPDA 調試架構

JPDA 三層架構:

  1. Java Debug Interface (JDI):

    • JDI 是高層 API,面向調試器提供的接口。調試器使用 JDI 與 JVM 進行交互,如設置斷點、查詢變量值等。JDI 屏蔽了 JDWP 的低層細節,使得調試工具開發更加簡單。

  2. Java Virtual Machine Tool Interface (JVMTI):

    • JVMTI 是一個與 JVM 直接交互的低層接口,負責暴露 JVM 的調試和性能監控功能。JDWP 協議通過 JVMTI 與 JVM 交互。

  3. Java Debug Wire Protocol (JDWP):

    • JDWP 是調試器和被調試 JVM 之間的通信協議,定義了數據包的格式和通信的規則。調試器通過 JDWP 來發送調試命令,並從 JVM 獲取調試信息。

JDWP 的工作流程

JDWP 是 調試器(Debuggee)和 目標 JVM(Debugger)之間的中間協議層。調試器可以通過本地或網絡通信來連接 JVM,並向 JVM 發送調試命令(例如設置斷點、檢查變量的值等)。JDWP 負責將這些高層的調試命令翻譯為底層的通信指令。

典型的 JDWP 調試工作流程:

  1. 啟動 JVM:當 JVM 以 -agentlib:jdwp 參數啟動時,JVM 會作為 JDWP 調試服務端,並開始等待調試器的連接。

  2. 調試器連接:調試器(如 IDE)使用 JDWP 協議連接到 JVM。這通常是通過套接字(dt_socket)來進行的網絡連接,或使用共享內存(dt_shmem)進行本地通信。

  3. 發送命令:調試器通過 JDWP 發送各種調試命令給 JVM,如設置斷點、執行單步調試、檢查變量等。

  4. 處理事件:JDWP 支持多種調試事件,如斷點事件、異常事件、線程啟動/停止事件等。JVM 會根據調試器設置的監聽條件觸發這些事件,並將信息通過 JDWP 反饋給調試器。

  5. 調試信息反饋:JVM 執行命令後,通過 JDWP 返回調試結果,如變量的當前值、當前線程堆棧信息等。

  6. 結束調試:調試器可以隨時斷開 JDWP 連接,結束調試會話。

JDWP 協議結構

JDWP 的通信是通過一系列數據包來進行的,這些數據包包含調試命令和調試響應。JDWP 協議定義了這些數據包的具體格式。

每個數據包包含以下基本結構:

  • 包長度:指明數據包的總長度。

  • 命令/響應標識:指示該數據包是調試器發送的命令還是 JVM 的響應。

  • 命令集:調試命令的分類(例如,線程命令、斷點命令等)。

  • 命令代碼:具體的命令。

  • 數據部分:包含具體的調試數據。

JDWP 支持的命令集包括:

  1. 虛擬機命令(Virtual Machine Commands):如 Suspend, Resume。

  2. 線程命令(Thread Commands):如 ThreadStart, ThreadDeath。

  3. 斷點命令(Breakpoint Commands):如 SetBreakpoint, ClearBreakpoint。

  4. 類命令(Class Commands):如 ClassPrepare, ClassUnload。

JDWP 啟動選項

在啟動 JVM 時,可以使用一個特殊的 JVM 選項來啟用 JDWP,從而支持遠程調試。常見的啟動選項為 -agentlib:jdwp,並可以通過參數配置 JDWP 的行為。

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
  • transport=dt_socket:指定使用套接字進行通信。

  • server=y:指定 JVM 作為調試服務器,等待調試器的連接。

  • suspend=n:JVM 不會在啟動時等待調試器連接,直接運行應用程式。如果設為 y,則會在啟動時暫停,等待調試器連接後再繼續運行。

  • address=5005:指定調試服務器的監聽端口號,調試器需要連接到這個端口。

JDWP 命令與事件

JDWP 支持多種命令和事件,這些命令使得調試器可以完全控制目標 JVM 的執行。常見的命令和事件包括:

1. 命令(Commands)

  • 虛擬機控制命令:

    • Suspend:暫停所有線程。

    • Resume:恢復所有線程。

  • 斷點設置命令:

    • SetBreakpoint:在指定的類和行號設置斷點。

    • ClearBreakpoint:清除指定位置的斷點。

  • 步進命令:

    • StepInto:進入下一個代碼步驟。

    • StepOver:跳過當前方法。

  • 堆棧檢查命令:

    • StackFrame:檢查當前執行的堆棧幀。

2. 事件(Events)

  • 斷點事件(BreakpointEvent):當代碼執行到斷點位置時觸發。

  • 異常事件(ExceptionEvent):當異常被拋出時觸發。

  • 線程啟動事件(ThreadStartEvent):當新線程啟動時觸發。

  • 類準備事件(ClassPrepareEvent):當類加載並準備好執行時觸發。

這些命令和事件為調試器提供了強大的控制能力,允許調試器查詢 JVM 的狀態、操控線程的執行以及捕獲異常和斷點。

JDWP 的應用場景

  1. 遠程調試:JDWP 被廣泛用於支持遠程調試,開發者可以通過網絡連接遠程運行的 JVM,進行代碼的調試、斷點設置、查看堆棧信息等操作。這在處理大型分佈式應用或微服務架構時尤為有用。

  2. 調試器工具開發:JDWP 是許多 Java IDE(如 IntelliJ IDEA、Eclipse)調試功能的基礎。調試工具通過 JDWP 與 JVM 進行交互,提供豐富的調試功能,如變量監視、方法跟蹤、斷點調試等。

  3. 性能監控與問題排查:JDWP 也可用於性能監控工具,監控應用運行狀況。當應用出現性能問題或異常行為時,可以通過 JDWP 進行在線調查,查看內存、線程堆棧、執行流程等信息。

  4. 動態調試:當需要在運行中的應用程序上進行代碼調試時,可以使用 JDWP 動態連接 JVM,而無需重啟應用程序。

JDWP 的安全性考

量

由於 JDWP 允許外部調試器控制 JVM,因此存在潛在的安全風險。開放的 JDWP 端口可能被惡意用戶利用來控制服務器或應用程序,特別是在生產環境中。因此,在啟用 JDWP 時需要進行額外的安全設置:

  • 使用防火牆限制端口訪問。

  • 配置 server=n,讓 JVM 作為調試客戶端,而不是服務端。

  • 使用安全協議(如 SSL)來加密 JDWP 通信。

總結

Java Debug Wire Protocol (JDWP) 是 Java 調試機制的重要組成部分,它提供了調試器與 JVM 之間的低層通信支持,允許遠程調試、斷點設置、線程控制等操作。JDWP 通過與 JDI 和 JVMTI 的協作,實現了強大而靈活的調試功能,是 Java 開發和調試過程中不可或缺的工具。

PreviousJVM Performance ToolNextJConsole 詳細介紹

Last updated 8 months ago