答案是开发调试器扩展需遵循DAP协议,通过yo code生成模板,实现初始化、断点管理、事件上报等功能,并与语言运行时集成,最终在launch.json中配置即可使用。

要在 Visual Studio Code 中为一种新型编程语言添加调试器支持,核心是开发一个调试器扩展,遵循 VS Code 的调试协议(Debug Adapter Protocol, DAP)。这个过程涉及几个关键步骤,帮助你将自定义语言的运行时与编辑器的调试界面连接起来。
理解 Debug Adapter Protocol (DAP)
DAP 是 VS Code 调试功能的核心通信机制。它定义了编辑器前端(UI)与后端调试服务(Debug Adapter)之间的 JSON-RPC 消息格式。你的扩展不需要直接处理语法高亮或代码补全,而是专注于实现一个“调试适配器”,负责与实际的语言解释器或编译器交互。
适配器通常以独立进程运行,接收来自 VS Code 的请求(如“启动程序”、“设置断点”),再将其转换为底层语言运行时可执行的操作,并返回结果(如变量值、调用栈)。
创建调试扩展的基本结构
使用 vscode-generator-code 脚手架工具可以快速生成调试扩展模板:
- 运行 yo code 并选择 “New Debug Adapter” 类型
- 生成内容包括 package.json 配置、启动逻辑和适配器主进程
- package.json 中需声明调试贡献点,如 debuggers.type、activationEvents 等
type 字段定义语言调试器的唯一标识,后续 launch.json 将引用该类型。
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
实现 Debug Adapter
适配器通常用 Node.js 编写,也可通过 stdin/stdout 与其他语言(如 Python、Rust)集成。主要任务包括:
- 初始化握手:响应 initialize 请求,告知客户端支持的功能(如是否支持断点、变量修改等)
- 处理 launch 或 attach 请求:根据用户配置启动目标程序或连接到正在运行的进程
- 断点管理:接收 setBreakpoints 请求,解析源码位置并通知运行时
- 事件上报:当程序暂停(如断点命中)、异常抛出时,主动发送 stopped 事件
- 支持调试操作:实现 continue、next、stepIn、stepOut 等控制命令
- 提供调试数据:响应 stackTraceRequest 返回调用栈,scopesRequest 返回作用域,variablesRequest 返回变量值
与语言运行时集成
这是最依赖具体语言的部分。常见方式有:
- 若语言有内置调试接口(如 Lua 的 debug.sethook、Python 的 pdb),可在适配器中嵌入脚本注入钩子
- 对于编译型语言,可生成带调试信息的输出,并通过外部调试器(类似 GDB)桥接
- 自研语言可在解释器中暴露 RPC 接口,供适配器调用
关键是将高级调试指令转化为运行时能理解的操作,并准确映射源码位置与执行状态。
基本上就这些。完成适配器后,在 .vscode/launch.json 中配置对应 type 和参数,即可在 VS Code 内使用断点、变量查看、调用栈等标准调试功能。调试协议的设计使得 UI 层与语言逻辑解耦,极大简化了扩展开发。










