调试适配器协议的新家

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

七月里程碑的一个目标是将调试适配器协议——它隐藏在一个相对晦涩的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事件,开发工具更新其用户界面并显示堆栈跟踪视图。这会触发一个stacktrace请求,该请求返回为各个堆栈帧显示的所有信息。
  • 如果用户选择一个堆栈帧,开发工具会使用variables请求来获取该帧的变量。

由于历史原因,DAP使用了一种基于JSON的传输格式,这种格式受到了(现已过时的)V8调试协议的启发。请注意,这种格式与LSP中使用的JSON-RPC相似,但并不兼容。

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

使用调试适配器协议

图片展示了DAP方法的两个重要优势:

  • 调试适配器可以在不同的开发工具之间共享,这有助于分摊它们的开发成本。
  • 调试适配器协议并不局限于VS Code,可以作为其他开发工具中通用调试器UI的基础。

这些特性与2016年在其网站上发布的语言服务器协议的特性相似。

DAP的新家

现在我们为调试适配器协议(Debug Adapter Protocol)采取了同样的措施,将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文件提交拉取请求来帮助保持支持工具和实现列表的最新状态: Debug Adapters, Tools, 和 SDKs.

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

安德烈·魏南德 -  @weinand on Twitter