在 VS Code 中试试

调试适配器协议的新家园

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

7 月里程碑的一个目标是将调试适配器协议——它隐藏在一个有点模糊的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 使用了一种受(现已过时)V8 调试协议启发的基于 JSON 的线格式。请注意,这种格式与 LSP 中使用的 JSON-RPC 类似但不兼容。

在简要了解 DAP 通信示例后,让我们回顾一下 DAP 方法的特点

with Debug Adapter Protocol

这张图展示了 DAP 方法的两个重要优势

  • 调试适配器可以在不同的开发工具之间共享,这有助于分摊其开发成本。
  • 调试适配器协议不局限于 VS Code,可以用作其他开发工具中通用调试器 UI 的基础。

这些特点与 2016 年在其独立网站上发布的语言服务器协议类似。

DAP 的新家园

现在,我们效仿了调试适配器协议,将其规范从旧位置迁移到一个新网站https://msdocs.cn/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 -  Twitter 上的 @weinand