🚀 在 VS Code 中免费获取 !

调试适配器协议的新家

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

七月里程碑的一个目标是将调试适配器协议——它之前隐藏在一个不太起眼的 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 使用基于 JSON 的线路格式,其灵感来自(现已过时的)V8 调试协议。请注意,此格式与 LSP 中使用的 JSON-RPC 相似但不兼容。

在这个简短的 DAP 通信示例之后,让我们回顾一下 DAP 方法的特点。

with Debug Adapter Protocol

图片显示了 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 现在也 支持此协议

在新位置,我们提供

旧位置 将继续托管 DAP 的三个 npm 模块的源代码

接下来是什么?

由于调试适配器协议已经可用相当长一段时间了,因此迁移到新网站实际上并不是开始,而只是搬到一个新家...

我们想邀请 DAP 的所有现有和未来用户访问我们的新家,并在那里继续合作。例如,您可以通过在 GitHub 中针对以下 Markdown 文件提交拉取请求,帮助保持支持工具和实现的列表更新:调试适配器工具SDK

代表 VS Code 团队:祝您编码愉快!

André Weinand -  @weinand