调试适配器协议的新家
2018 年 8 月 7 日 André Weinand, @weinand
七月里程碑的一个目标是将一直“隐藏”在某个不太知名的 GitHub 项目中的 Debug Adapter Protocol(调试适配器协议)迁移到一个更显眼的网站(参见功能请求 #19636)。
本博客将提供有关协议、Debug Adapter Protocol 以及此次迁移动机的一些背景信息。
为什么需要通过协议解耦?
来自另一篇博客
“Visual Studio Code 是面向所有开发人员的编辑器,无论您使用何种编程语言。”
这一承诺基于(至少)两大支柱:
- 一个可扩展的工具平台和生态系统,每个人都可以轻松贡献。
- 使任何编程语言都能轻松获得出色工具支持的技术。
开发工具对编程语言的支持意味着:
- 基于对语言的深入理解(即“语言智能”)的丰富编辑支持。
- 集成到编辑工具中的语言调试支持。
后者可能会让一些人感到惊讶,但我们始终坚信调试是编写源代码的地方(即编辑器)不可或缺的一部分。调试是开发“内循环”的重要组成部分。
但为新的语言向 IDE 或编辑器添加调试器是一项巨大的工作,因为标准调试功能列表并不短:
- 源代码、函数、条件、内联断点和日志点。
- 在悬停或内联在源代码中显示的变量值。
- 多进程和多线程支持。
- 导航复杂的数据结构。
- 监视表达式。
- 带有自动完成功能的交互式评估调试控制台 (REPL)。
为新语言实现这些功能不仅需要付出巨大的努力,而且令人沮丧的是,这项工作必须针对每个开发工具重复进行,因为每个工具都使用不同的 API 来实现其用户界面。
这导致了大量的重复功能(和实现),如下图中的蓝色框所示:

当我们开始开发 Visual Studio Code 时,我们始终设想尽可能地将“前端”UI 与特定语言的“后端”实现解耦。我们希望对语言智能和调试支持都这样做。
今天,我们相信我们已经实现了这个雄心勃勃的目标:
我们创建了两个抽象协议,允许将“前端”中的编辑和调试用户界面与“后端”组件提供的特定语言智能和调试功能解耦。
“对语言的深入理解”由 Language Server Protocol(LSP,语言服务器协议)体现,“调试支持”由 Debug Adapter Protocol(DAP,调试适配器协议)体现。
Debug Adapter Protocol
Debug Adapter Protocol 背后的想法是标准化一个抽象协议,用于开发工具的调试组件如何与具体的调试器或运行时进行通信。
由于假定现有的调试器或运行时会在短期内采用此协议是不现实的,因此我们设计了一个中间组件来承担将现有调试器或运行时 API 适配到 Debug Adapter Protocol 的角色。这个中间组件变成了 Debug Adapter(调试适配器),这也解释了协议的名称:Debug Adapter Protocol。
下面是一个开发工具如何使用 DAP 与流行“gdb”调试器的 Debug Adapter 进行通信的示例:

我们假设用户已经开始了一个调试会话,但目前在程序的入口点停止,并希望设置(并稍后命中)一个断点。
- 用户通过单击断点槽来在特定源文件中设置一个或多个断点。开发工具向 Debug Adapter 发送一个
setBreakpoints请求,Debug Adapter 将断点注册到 gdb 调试器。 - 然后用户按下 Continue(继续)按钮以恢复执行。工具向 Debug Adapter 发送一个
continue请求,Debug Adapter 将其转换为相应的 gdb 命令。 - 一段时间后,断点被命中,Debug Adapter 从 gdb 收到一些通知,并将其转换为一个 DAP
stopped事件,该事件被发送到开发工具。 - 为了响应此
stopped事件,开发工具更新其 UI 并显示堆栈跟踪视图。这会触发一个stacktrace请求,该请求返回为单个堆栈帧显示的所有信息。 - 如果用户选择一个堆栈帧,开发工具会使用
variables请求获取该帧的变量。
出于历史原因,DAP 使用基于 JSON 的有线格式,灵感来自(现已过时的)V8 Debugging Protocol。请注意,此格式与 LSP 中使用的 JSON-RPC 相似但不兼容。
在简短介绍了 DAP 通信示例之后,让我们回顾一下 DAP 方法的特点:

这张图片显示了 DAP 方法的两个重要好处:
- Debug Adapters 可以在不同的开发工具之间共享,这有助于分摊它们的开发成本。
- Debug Adapter Protocol 不局限于 VS Code,可以用作其他开发工具中通用调试器 UI 的基础。
这些特点类似于 2016 年发布在自己的网站上的 Language Server Protocol 的特点。
DAP 的新家
现在我们效仿了 Debug Adapter Protocol,将 DAP 规范从其旧位置迁移到了一个新网站 https://msdocs.cn/debug-adapter-protocol 以及相应的存储库 https://github.com/microsoft/debug-adapter-protocol。
这次迁移应该强调 Debug Adapter Protocol 并非特定于 Visual Studio Code。例如,Visual Studio 现在也支持此协议。
在新位置,我们提供:
- 协议的概述和介绍。
- 作为机器可处理的 JSON-schema 的协议规范。
- 从协议规范自动生成的详细文档。
- 实现该协议的Debug Adapters。
- 托管该协议的开发工具。
- 支持该协议的SDKs。
- 错误、功能请求和拉取请求可以在新存储库的Issues(问题)部分创建。
旧位置将继续托管用于 DAP 的三个 npm 模块的源代码:
下一步是什么?
由于 Debug Adapter Protocol 已经面世相当长一段时间了,所以迁移到新网站并不是真正的开端,而只是搬到了一个新家...
我们想邀请所有 DAP 的现有和未来用户访问我们的新家,并在那里继续协作。例如,您可以通过向 GitHub 提交针对这些 Markdown 文件的拉取请求来帮助保持支持工具和实现列表的最新状态:Debug Adapters、Tools 和 SDKs。
代表 VS Code 团队:祝您编码愉快!
André Weinand - Twitter 上的 @weinand