调试适配器协议的新家
2018 年 8 月 7 日 André Weinand, @weinand
7 月里程碑的一个目标是将隐藏在相对隐蔽的 GitHub 项目 中的 调试适配器协议 迁移到一个更醒目的网站(参见功能请求 #19636)。
本博客文章介绍了协议、调试适配器协议的背景以及迁移的动机。
为何需要通过协议解耦?
摘自另一篇 博客
“Visual Studio Code 是面向任何开发人员的编辑器,无论您使用何种编程语言。”
这一承诺基于(至少)两大支柱
- 一个可扩展的工具平台和生态系统,任何人都可以轻松贡献。
- 使添加对任何编程语言的强大工具支持变得容易的技术。
从开发工具支持一种编程语言意味着
- 基于对语言的深入理解(也称为“语言智能”)的丰富编辑支持。
- 集成到编辑工具中的语言调试支持。
后者可能让一些人感到惊讶,但我们始终坚信,调试是源代码编写地点——编辑器——不可或缺的一部分。调试是开发“内循环”的重要组成部分。
但为新语言向 IDE 或编辑器添加调试器是一项艰巨的任务,因为标准调试功能的列表并不短
- 源、函数、条件、内联断点和 logpoints。
- 悬停时或源代码中内联显示的变量值。
- 多进程和多线程支持。
- 遍历复杂数据结构。
- 监视表达式。
- 用于交互式评估并带自动完成功能的调试控制台 (REPL)。
为新语言实现这些功能不仅需要付出巨大努力,而且令人沮丧的是,由于每个开发工具使用不同的 API 实现其用户界面,这项工作必须为每个工具重复进行。
这导致了大量重复的功能(和实现),如下图中的蓝色框所示
当我们开始 Visual Studio Code 的工作时,我们一直设想尽可能地将“前端”UI 与语言特定的“后端”实现解耦。我们希望对语言智能和调试支持都这样做。
今天,我们相信我们已经实现了这个雄心勃勃的目标
我们创建了两个抽象协议,允许将“前端”的编辑和调试用户界面与“后端”组件提供的语言特定的智能和调试功能解耦。
“对语言的深入理解”由 语言服务器协议 (LSP) 体现,而“调试支持”由调试适配器协议 (DAP) 体现。
调试适配器协议
调试适配器协议背后的想法是标准化一个抽象协议,用于规定开发工具的调试组件如何与具体的调试器或运行时通信。
鉴于现有调试器或运行时不可能很快采用此协议,我们转而设计了一个中间组件来承担将现有调试器或运行时 API 适配到调试适配器协议的角色。这个中间组件就成为了调试适配器,这解释了该协议的名称:调试适配器协议。
下面是一个开发工具如何使用 DAP 与流行调试器“gdb”的调试适配器通信的示例
我们假设用户已经开始了一个调试会话,但目前停止在程序入口点,并希望设置(并稍后命中)一个断点。
- 用户通过单击断点槽在特定源文件中设置一个或多个断点。开发工具向调试适配器发送
setBreakpoints
请求,该请求将断点注册到 gdb 调试器。 - 用户然后按下继续按钮恢复执行。工具向调试适配器发送
continue
请求,该请求将其转换为相应的 gdb 命令。 - 一段时间后,命中断点,调试适配器从 gdb 接收到一些通知,并将其转换为 DAP
stopped
事件,然后发送给开发工具。 - 响应此
stopped
事件,开发工具更新其 UI 并显示堆栈跟踪视图。这将触发一个stacktrace
请求,该请求返回为单个堆栈帧显示的所有信息。 - 如果用户选择一个堆栈帧,开发工具会使用
variables
请求获取该帧的变量。
由于历史原因,DAP 使用受(现已废弃的)V8 Debugging Protocol 启发的基于 JSON 的线格式。请注意,此格式与 LSP 中使用的 JSON-RPC 相似但不兼容。
在这个简短的 DAP 通信示例之后,让我们回顾一下 DAP 方法的特点
该图显示了 DAP 方法的两个重要好处
- 调试适配器可以在不同的开发工具之间共享,这有助于分摊其开发成本。
- 调试适配器协议不与 VS Code 绑定,可作为其他开发工具中通用调试器 UI 的基础。
这些特点与 2016 年发布在其独立 网站 上的语言服务器协议相似。
DAP 的新家
现在,我们遵循了相同的做法,将调试适配器协议规范从其 旧位置 迁移到了新网站 https://msdocs.cn/debug-adapter-protocol 和相应的仓库 https://github.com/microsoft/debug-adapter-protocol。
此举旨在强调调试适配器协议并非 Visual Studio Code 特有。例如,Visual Studio 现在也支持此协议。
在新位置,我们提供了
- 协议的概述和介绍。
- 可由机器处理的JSON-schema 格式的协议规范。
- 从协议规范自动生成的详细文档。
- 实现该协议的调试适配器。
- 托管该协议的开发工具。
- 支持该协议的SDK。
- 可以在新仓库的问题部分创建错误、功能请求和拉取请求。
旧位置 将继续托管 DAP 的三个 npm 模块的源代码
下一步是什么?
由于调试适配器协议已经可用了一段时间,迁移到新网站并非真正意义上的开端,而只是搬到了新家...
我们邀请所有现有和未来的 DAP 用户访问我们的新家并在那里继续协作。例如,您可以通过在 GitHub 上针对以下 Markdown 文件提交拉取请求来帮助更新支持工具和实现的列表:调试适配器、工具 和 SDK。
VS Code 团队致敬:编码快乐!
André Weinand - Twitter 上的 @weinand