调试适配器协议的新家
2018 年 8 月 7 日 André Weinand,@weinand
7 月里程碑的一个目标是将 **调试适配器协议**(它隐藏在不太明显的 GitHub 项目 中)移动到更突出的网站(参见功能请求 #19636)。
本篇博文提供了关于协议、调试适配器协议以及移动背后的动机的背景信息。
为什么需要使用协议进行解耦?
来自另一篇 博客
"Visual Studio Code 是任何开发者的编辑器,无论您使用什么编程语言。"。
这个承诺基于(至少)两大支柱
- 一个可扩展的工具平台和生态系统,每个人都可以轻松地做出贡献。
- 使为任何编程语言轻松添加出色工具支持的技术。
从开发工具支持编程语言意味着
- 基于对语言的深刻理解的丰富编辑支持(也称为“语言智能”)。
- 集成到编辑工具中的语言调试支持。
后者可能让一些人感到意外,但我们始终坚信调试是源代码编写位置不可或缺的一部分:编辑器。调试是开发“内部循环”的重要组成部分。
但是,为 IDE 或编辑器添加新语言的调试器是一项重大工作,因为标准调试功能列表并不小
- 源代码、函数、条件、内联断点和 日志点。
- 在悬停中或内联在源代码中显示的变量值。
- 多进程和多线程支持。
- 浏览复杂数据结构。
- 监视表达式。
- 具有自动完成功能的交互式评估调试控制台(REPL)。
为新语言实现这些功能不仅是一项重大工作,而且令人沮丧的是,这项工作必须针对每个开发工具重复进行,因为每个工具使用不同的 API 来实现其用户界面。
这会导致大量重复的功能(和实现),如下图中的蓝色方框所示
当我们开始 Visual Studio Code 的工作时,我们一直设想尽可能地将“前端”UI 与特定语言的“后端”实现解耦。我们想对语言智能和调试支持都这样做。
今天,我们相信我们已经实现了这个雄心勃勃的目标
我们创建了两个抽象协议,允许将“前端”中的编辑和调试用户界面与“后端”组件提供的特定语言的智能和调试功能解耦。
“对语言的深刻理解”由 语言服务器协议 (LSP) 提供,而“调试支持”则由调试适配器协议 (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。
- 错误、功能请求和拉取请求可以在新存储库的 问题 部分创建。
旧位置 将继续托管用于 DAP 的三个 npm 模块的源代码
下一步是什么?
由于调试适配器协议已经存在了一段时间,因此迁移到新网站并非真正的开创,而只是一个搬家...
我们邀请所有现有和未来的 DAP 用户访问我们的新家,并继续在那里的合作。例如,您可以通过提交针对这些 Markdown 文件的 GitHub 拉取请求,帮助保持支持工具和实现列表的最新状态:调试适配器、工具 和 SDK。
代表 VS Code 团队:祝您编码愉快!
André Weinand - @weinand on Twitter