JDWP (Java Debug Wire Protocol) Agent 是 JPDA (Java Platform Debug Architecture) 的核心組件,運行在目標 JVM 進程中,負責與調試器雙向通信,執行調試命令、發送事件通知。本文基於 Apache Harmony 實現,剖析其架構設計、命令/事件流程、線程模型、擴展機制及測試框架。


| 模塊 | 職責 |
|---|---|
| Transport Manager | 管理傳輸通道(默認 dt_socket),收發原始封包。 |
| Packet Dispatcher | 解析封包頭,分發命令封包給 Command Dispatcher。 |
| Command Dispatcher | 根據命令集/命令 ID 路由到具體 Command Handler。 |
| Command Handler (Sync/Async) | 執行具體調試操作(讀寫變量、設置斷點、執行方法等)。 |
| Request Manager | 維護調試器設置的事件請求,控制 JVMTI 事件開關。 |
| Event Callback | JVMTI 事件觸發入口,組裝事件封包發給 Event Dispatcher。 |
| Event Dispatcher | 將事件封包發送給 Transport Manager 轉發調試器。 |
| Thread Manager | 管理 Agent 內部線程與 JVM 線程,掛起/恢復、隱藏內部線程。 |
| Object Manager | JNI 引用 ↔ JDWP ObjectID 映射,防止 GC 回收被調試對象。 |
| Packet Wrapper | 封包解析/構建工具,提供類型安全訪問。 |
| Memory Manager | 基於 JVMTI 分配/釋放內存,配合 AutoFree RAII 機制防洩漏。 |
| Log Manager | 分級追蹤日誌(CMD、PACK、DATA、EVENT、MEM、THRD、MON、JVMTI...)。 |

InvokeMethod):啟動工作線程執行,主線程立即返回,完成後異步發送回復。
AgentAutoFree、JvmtiAutoFree 自動釋放內存;MonitorAutoLock 基於 JVMTI 原始監視器實現同步塊,確保異常安全。AgentException 統一錯誤碼,跨模塊傳遞錯誤信息。SyncCommandHandler 或 AsyncCommandHandler 實現 execute(),放入對應命令集目錄,註冊到 CommandDispatcher。trace=log_kinds、src=files、log=file 啟動參數動態控制輸出。
org.apache.harmony.jpda.tests.jdwp.<CommandSet>.<Command>Test、Events.<Event>Test。jpda.settings.* 控制 transport、timeout、agent options、debuggee JVM 路徑、手動啟動模式(便於 native debugger 掛載)。-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
# 或
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
Agent 還支持 trace、src、log 等內部調試參數。
JDWP Agent 以模塊化、線程安全、可擴展設計實現了 JPDA 規範,是 Java 調試生態(IDE、遠程調試、APM、動態追蹤)的基石。理解其架構有助於排查調試連接問題、開發自定義調試工具、優化 Agent 性能或移植到新平台。