參加你附近的 ,瞭解 VS Code 中的 AI 輔助開發。

除錯介面卡協議的新家

2018年8月7日 André Weinand,@weinand

七月里程碑的一個目標是將除錯介面卡協議——它一直“隱藏”在一個有點模糊的GitHub專案中——遷移到一個更醒目的網站(參見功能請求#19636)。

這篇部落格將提供關於協議、除錯介面卡協議以及此次遷移背後動機的一些背景資訊。

為什麼需要透過協議解耦?

摘自另一篇部落格

“Visual Studio Code 是面向任何開發者的編輯器,無論您使用何種程式語言。”

這一承諾基於(至少)兩個支柱:

  • 一個可擴充套件的工具平臺和生態系統,每個人都可以輕鬆貢獻。
  • 使為任何程式語言添加出色的工具支援變得容易的技術。

從開發工具的角度支援一種程式語言意味著:

  • 基於對語言的深入理解(又稱“語言智慧”)的豐富編輯支援。
  • 整合到編輯工具中的語言除錯支援。

後者可能讓一些人感到驚訝,但我們一直堅信除錯是原始碼編寫地點的組成部分:編輯器。除錯是開發“內部迴圈”的重要組成部分。

但是,為新的語言向IDE或編輯器新增偵錯程式是一項重大的工作,因為標準除錯功能的列表並不短:

  • 源、函式、條件、內聯斷點和日誌點
  • 變數值顯示在懸停提示或原始碼中內聯。
  • 多程序和多執行緒支援。
  • 遍歷複雜的資料結構。
  • 監視表示式。
  • 用於互動式評估並帶自動補全的除錯控制檯(REPL)。

為新的語言實現這些功能不僅是一項重大工作,而且令人沮喪的是,這項工作必須針對每個開發工具重複進行,因為每個工具都使用不同的API來實現其使用者介面。

這導致了大量的重複功能(和實現),如下圖中的藍色方框所示:

without Debug Adapter Protocol

當我們開始 Visual Studio Code 的工作時,我們總是設想盡可能地將“前端”UI 與特定語言的“後端”實現解耦。我們希望對語言智慧和除錯支援都這樣做。

今天,我們相信我們已經實現了這個宏偉的目標:

我們建立了兩個抽象協議,允許將“前端”的編輯和除錯使用者介面與“後端”元件提供的特定語言智慧和除錯功能解耦。

“對語言的深入理解”由語言伺服器協議(LSP)呈現,“除錯支援”由除錯介面卡協議(DAP)呈現。

除錯介面卡協議

除錯介面卡協議背後的理念是標準化一個抽象協議,用於開發工具的除錯元件如何與具體的偵錯程式或執行時進行通訊。

由於假設現有偵錯程式或執行時會很快採用此協議是不現實的,因此我們設計了一個中間元件來承擔將現有偵錯程式或執行時API適配到除錯介面卡協議的角色。這個中間元件成為除錯介面卡,這解釋了協議的名稱:除錯介面卡協議。

下面是一個開發工具如何使用DAP與流行的“gdb”偵錯程式的除錯介面卡進行通訊的示例:

breakpoint

我們假設使用者已經啟動了除錯會話,但目前停留在程式入口點,並希望設定(並稍後命中)一個斷點。

  • 使用者透過點選斷點槽在一個特定的原始檔中設定一個或多個斷點。開發工具向除錯介面卡傳送一個setBreakpoints請求,除錯介面卡將該斷點註冊到gdb偵錯程式。
  • 然後使用者按下繼續按鈕以恢復執行。工具向除錯介面卡傳送一個continue請求,除錯介面卡將其轉換為相應的gdb命令。
  • 一段時間後,斷點被命中,除錯介面卡從gdb接收到一些通知,並將其轉換為一個DAP stopped事件,該事件被髮送到開發工具。
  • 響應此stopped事件,開發工具更新其UI並顯示堆疊跟蹤檢視。這會觸發一個stacktrace請求,該請求返回為單個堆疊幀顯示的所有資訊。
  • 如果使用者選擇一個堆疊幀,開發工具會透過variables請求該幀的變數。

由於歷史原因,DAP使用基於JSON的線纜格式,其靈感來自(現已廢棄的)V8除錯協議。請注意,此格式與LSP中使用的JSON-RPC類似但不相容。

在DAP通訊的這個簡短示例之後,讓我們回顧一下DAP方法的特點:

with Debug Adapter Protocol

這張圖展示了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現在也支援此協議

在新位置,我們提供:

舊位置將繼續託管DAP的三個npm模組的原始碼:

下一步是什麼?

由於除錯介面卡協議已經存在了一段時間,所以遷移到新網站並不是真正意義上的建立,而只是搬到了一個新家……

我們誠摯邀請DAP的所有現有和未來的使用者訪問我們的新家,並在那裡繼續合作。例如,您可以透過在GitHub上針對這些Markdown檔案提交拉取請求來幫助保持支援工具和實現列表的最新狀態:除錯介面卡工具SDK

代表 VS Code 團隊:祝您編碼愉快!

André Weinand -  @weinand on Twitter