除錯配接器協定的新家
2018 年 8 月 7 日,André Weinand,@weinand
七月里程碑的目標之一是將除錯配接器協定 (Debug Adapter Protocol) 移至更顯著的網站 (參見功能請求 #19636) -- 該協定之前隱藏在一個較不明顯的 GitHub 專案中。
這篇部落格文章提供關於協定、除錯配接器協定,以及這次搬遷背後動機的一些背景資訊。
為什麼需要使用協定進行解耦?
從另一篇部落格文章
「Visual Studio Code 是一個為所有開發人員設計的編輯器,無論您使用哪種程式語言。」
這個承諾至少基於兩大支柱
- 一個可擴充的工具平台和生態系統,讓每個人都能輕鬆貢獻。
- 讓為任何程式語言新增絕佳工具支援變得容易的技術。
從開發工具支援一種程式語言意味著
- 基於對語言的深入理解的豐富編輯支援 (又稱「語言智慧」)。
- 整合到編輯工具中的語言除錯支援。
後者可能會讓某些人感到驚訝,但我們一直堅信,除錯是原始碼編寫地點 (編輯器) 不可或缺的一部分。除錯是開發「內迴圈」的重要環節。
但是為 IDE 或編輯器中的新語言新增除錯器是一項重大工程,因為標準除錯功能列表並不少
- 來源、函式、條件式、行內中斷點,以及記錄點。
- 在hover提示或行內原始碼中顯示的變數值。
- 多進程和多執行緒支援。
- 導覽複雜的資料結構。
- 監看運算式。
- 具備自動完成功能的互動式評估除錯主控台 (REPL)。
為新語言實作這些功能不僅是一項重大工程,更令人沮喪的是,這項工作必須針對每個開發工具重複進行,因為每個工具都使用不同的 API 來實作其使用者介面。
這導致大量重複的功能 (和實作),如下圖中的藍色方框所示
當我們開始 Visual Studio Code 的工作時,我們一直設想盡可能地將「前端」UI 與語言特定的「後端」實作解耦。我們希望對語言智慧和除錯支援都做到這一點。
今天,我們相信我們已經實現了這個雄心勃勃的目標
我們建立了兩個抽象協定,允許將「前端」的編輯和除錯使用者介面,與「後端」組件提供的語言特定智慧和除錯功能解耦。
「對語言的深入理解」由語言伺服器協定 (Language Server Protocol, LSP) 呈現,「除錯支援」則由除錯配接器協定 (Debug Adapter Protocol, DAP) 呈現。
除錯配接器協定
除錯配接器協定背後的想法是標準化一個抽象協定,用於規範開發工具的除錯組件如何與具體的除錯器或執行階段環境通訊。
由於假設現有的除錯器或執行階段環境很快就會採用此協定是不切實際的,因此我們設計了一個中介組件,負責將現有的除錯器或執行階段環境 API 調整為除錯配接器協定。這個中介組件成為除錯配接器,這也解釋了協定的名稱:除錯配接器協定。
這是一個開發工具如何使用 DAP 與熱門「gdb」除錯器的除錯配接器通訊的範例
我們假設使用者已經開始除錯會期,但目前停在其程式的進入點,並想要設定 (以及稍後命中) 中斷點。
- 使用者透過點擊中斷點邊溝,在特定的原始碼檔案中設定一個或多個中斷點。開發工具向除錯配接器發送
setBreakpoints
請求,除錯配接器會在 gdb 除錯器中註冊中斷點。 - 然後使用者按下「繼續」按鈕以恢復執行。工具向除錯配接器發送
continue
請求,除錯配接器會將其轉換為對應的 gdb 命令。 - 過了一段時間,中斷點被命中了,除錯配接器從 gdb 收到一些通知,並將其轉換為 DAP
stopped
事件,然後將該事件發送到開發工具。 - 為了回應此
stopped
事件,開發工具更新其 UI 並顯示堆疊追蹤檢視。這會觸發stacktrace
請求,該請求會傳回為個別堆疊框架顯示的所有資訊。 - 如果使用者選擇一個堆疊框架,開發工具會透過
variables
請求來請求該框架的變數。
基於歷史原因,DAP 使用以 JSON 為基礎的線路格式,其靈感來自 (現已過時的) V8 除錯協定。請注意,此格式與 LSP 中使用的 JSON-RPC 相似但不相容。
在這個 DAP 通訊的簡短範例之後,讓我們回顧一下 DAP 方法的特性
這張圖片顯示了 DAP 方法的兩個重要優點
- 除錯配接器可以在不同的開發工具之間共用,這有助於攤銷其開發成本。
- 除錯配接器協定並非 VS Code 專屬,可以用作其他開發工具中通用除錯器 UI 的基礎。
這些特性與 2016 年在其專屬網站上發布的語言伺服器協定相似。
DAP 的新家
現在,我們也針對除錯配接器協定採取了類似的做法,將 DAP 規格從其舊位置移至新的網站 https://microsoft.github.io/debug-adapter-protocol 和對應的儲存庫 https://github.com/microsoft/debug-adapter-protocol。
這次搬遷應該強調除錯配接器協定並非 Visual Studio Code 專屬。例如,Visual Studio 現在也支援此協定。
在新位置,我們提供
- 協定的概觀和簡介。
- 作為機器可處理 JSON 結構描述的協定規格。
- 從協定規格自動產生的詳細文件。
- 實作該協定的除錯配接器。
- 託管該協定的開發工具。
- 支援該協定的 SDK。
- 錯誤、功能請求和提取請求可以在新儲存庫的 Issues 區段下建立。
舊位置將繼續託管 DAP 的三個 npm 模組的原始碼
接下來是什麼?
由於除錯配接器協定已經可用相當長一段時間,因此遷移到新網站實際上並非創始,而只是搬到新家...
我們想邀請所有 DAP 的現有和未來使用者造訪我們的新家,並在那裡繼續協作。例如,您可以透過在 GitHub 中針對這些 Markdown 檔案提交提取請求,來協助保持支援工具和實作列表的最新狀態:除錯配接器、工具和 SDK。
謹代表 VS Code 團隊:祝您編碼愉快!
André Weinand - @weinand 在 Twitter 上