要让VSCode支持自定义调试器,需实现符合DAP协议的调试适配器。DAP基于JSON-RPC,通过stdin/stdout、Socket或Named pipes通信,使用Content-Length头分隔消息。适配器需处理initialize、launch/attach、setBreakpoints、continue等请求,响应并发送stopped、initialized等事件。推荐使用@vscode/debugadapter等库简化开发,适配器以独立进程运行,由VSCode根据package.json的debugServer或runtime启动。在扩展中声明debuggers贡献点,注册语言类型与配置,激活时启动适配器。核心是正确实现初始化、断点管理、执行控制与数据查询接口,确保消息格式与事件顺序准确。

要让 VSCode 支持自定义调试器,核心在于实现一个符合 VSCode 调试协议(Debug Adapter Protocol, DAP) 的调试适配器(Debug Adapter)。DAP 是一种标准化的通信协议,定义了编辑器(如 VSCode)与底层调试引擎之间的交互方式。通过实现 DAP 适配器,你可以将任意语言或运行时接入 VSCode 调试环境。
理解 Debug Adapter Protocol (DAP)
DAP 基于 JSON-RPC 实现,使用请求-响应和事件通知机制。VSCode 作为客户端发送请求(如启动、暂停、步进),调试适配器作为服务端处理这些请求并返回结果或发出事件(如断点命中、变量更新)。
通信通道可以是:
- 标准输入/输出(stdin/stdout)——适用于进程内或子进程模式
- Socket 连接 —— 用于远程调试场景
- Named pipes —— Windows 上可选方式
消息格式为带 Content-Length 头的 JSON 字符串,例如:
Content-Length: 134\r\n\r\n{"type": "request", "command": "launch", "arguments": {"program": "app.js"}, "seq": 1}构建自定义调试适配器的关键步骤
你需要实现一个程序,能够接收来自 VSCode 的 DAP 消息,并正确响应。以下是关键流程:
1. 启动与初始化
- VSCode 发送 initialize 请求,携带客户端能力信息
- 适配器必须返回支持的功能(如是否支持断点、变量查看等)
- 完成握手后,等待 launch 或 attach 命令
2. 处理 launch/attach 请求
- 解析用户配置(如程序路径、参数、工作目录)
- 启动目标程序或连接到已运行进程
- 成功后回复 success: true,并触发 initialized 事件通知 VSCode 可以设置断点
3. 断点管理
- 收到 setBreakpoints 请求时,根据文件路径和行号设置断点
- 验证有效性,返回实际生效的断点位置
- 当程序执行到达断点时,向 VSCode 发送 stopped 事件
4. 执行控制
- 响应 continue、next、stepIn、stepOut 等命令
- 调用底层调试引擎执行对应操作
- 操作完成后可能再次触发 stopped 事件
5. 数据查询
- 处理 stackTrace:返回当前调用栈(包含帧 ID 和位置)
- 处理 scopes:获取作用域列表(如局部变量、全局变量)
- 处理 variables:根据作用域或父变量 ID 返回变量值
技术实现建议
推荐使用现有库简化开发:
- TypeScript/Node.js:使用 @vscode/debugadapter 提供基类和工具
- Python:可用 pydevd 或自行基于 socket 实现 DAP
- Go/C++/Rust:有第三方 DAP 库可用,也可手动解析 JSON-RPC
适配器通常以独立进程运行,由 VSCode 根据 package.json 中的 debugServer 或 runtime 字段启动。
注册调试器到 VSCode 扩展
在扩展的 package.json 中声明调试贡献点:
"contributes": {
"debuggers": [{
"type": "mylang",
"label": "My Language Debugger",
"languages": ["mylang"],
"configurationAttributes": { /* launch.json schema */ },
"initialConfigurations": [ /* 示例配置 */ ]
}]
}并在激活扩展时启动适配器(可通过 spawn 子进程或监听端口方式)。
基本上就这些。只要你的适配器能正确响应 DAP 消息并反馈程序状态,VSCode 就能显示堆栈、变量、支持断点和步进操作。关键是准确实现 initialize、launch、setBreakpoints、stackTrace 和 variables 等核心接口。不复杂但容易忽略细节,比如消息头长度计算或异步事件顺序。










