调试适配器协议的新家

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

7 月份的一个里程碑目标是将调试适配器协议 (Debug Adapter Protocol) —— 它此前一直隐藏在一个相对隐蔽的 GitHub 项目中 —— 迁移到一个更显眼的网站上(参见功能请求 #19636)。

本篇博客将提供一些关于协议、调试适配器协议的背景信息,以及此次迁移背后的动机。

为什么需要通过协议来实现解耦?

来自另一篇博客

“Visual Studio Code 是一款面向任何开发者的编辑器,无论你使用何种编程语言。”

这一承诺基于(至少)两个支柱:

  • 一个可扩展的工具平台和生态系统,每个人都可以轻松做出贡献。
  • 一种能够轻松为任何编程语言添加出色工具支持的技术。

在开发工具中支持一种编程语言意味着:

  • 基于对语言的深刻理解(又称“语言智能”)提供丰富的编辑支持。
  • 将该语言的调试支持集成到编辑工具中。

后者可能会让一些人感到惊讶,但我们始终坚定地认为,调试是源代码编写工作(即编辑器)中不可或缺的一部分。调试是开发“内部循环”的重要组成部分。

但是,为 IDE 或编辑器添加一种新语言的调试器是一项艰巨的任务,因为标准调试功能的列表并不短:

  • 源代码、函数、条件、行内断点以及日志点 (logpoints)
  • 在悬停提示或源代码行内显示变量值。
  • 多进程和多线程支持。
  • 浏览复杂的数据结构。
  • 监视表达式 (Watch expressions)。
  • 带有自动补全功能的交互式评估调试控制台 (REPL)。

为新语言实现这些功能不仅需要巨大的工作量,更令人沮丧的是,由于每个工具实现其用户界面时使用的 API 不同,这些工作必须在每个开发工具中重复进行。

这导致了大量重复的功能(和实现),如下图中的蓝色框所示:

without Debug Adapter Protocol

当我们开始开发 Visual Studio Code 时,我们就设想尽可能将“前端” UI 与语言特定的“后端”实现解耦。我们希望在语言智能和调试支持方面都实现这一点。

今天,我们相信已经实现了这个宏伟目标。

我们创建了两个抽象协议,允许将“前端”的编辑和调试用户界面与“后端”组件提供的特定语言智能和调试功能进行解耦。

“对语言的深刻理解”由语言服务器协议 (LSP) 实现,“调试支持”由调试适配器协议 (DAP) 实现。

调试适配器协议 (DAP)

调试适配器协议背后的理念是,针对开发工具的调试组件如何与具体的调试器或运行时通信,标准化一种抽象协议。

由于指望现有的调试器或运行时很快采用该协议是不现实的,我们设计了一个中间件组件来承担适配现有调试器或运行时 API 到调试适配器协议的角色。这个中间件就成了“调试适配器”,这就是协议名称“调试适配器协议”的由来。

下面是一个示例,展示了开发工具如何利用 DAP 与流行的 "gdb" 调试器的调试适配器进行通信:

breakpoint

假设用户已经启动了一个调试会话,但目前在程序的入口点停止,并希望设置(稍后触发)一个断点。

  • 用户通过点击断点槽 (breakpoint gutter) 在特定源文件中设置一个或多个断点。开发工具向调试适配器发送 setBreakpoints 请求,调试适配器随后在 gdb 调试器中注册该断点。
  • 然后用户按下继续 (Continue) 按钮恢复执行。工具向调试适配器发送 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 的新家

现在,我们效仿语言服务器协议,将 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

© . This site is unofficial and not affiliated with Microsoft.