f5没反应是因调试适配器未触发,主因有三:package.json的contributes.debuggers.type与launch.json的"type"不一致;缺少"ondebugresolve:xxx"激活事件;debugadapterexecutable路径错误或无执行权限。

自定义 Debugger Extension 联动不是配完 launch.json 就能跑通,关键在调试适配器进程是否真正启动、DAP 消息能否双向流通、以及 VSCode 是否识别到你注册的 type。
为什么 F5 启动后没反应,连日志都不打印
VSCode 根本没触发你的调试适配器,常见原因有三个:
-
package.json里contributes.debuggers.type值和launch.json中的"type"不一致 —— 比如注册了"mylang",但配置写成了"my-language" - 缺少
"activationEvents": ["onDebugResolve:mylang"],导致插件未被激活,registerDebugAdapterDescriptorFactory根本没执行 - 适配器可执行文件路径错误:
DebugAdapterExecutable指向的 JS 文件不存在、没编译(TS 项目忘运行tsc)、或权限不足(Linux/macOS 下没chmod +x)
调试适配器进程启动了,但断点不命中
适配器已运行,说明 DAP 连接建立成功,但断点“悬空”本质是源码映射断裂:
-
setBreakpointsRequest收到后,适配器必须返回准确的breakpoints数组,每个 breakpoint 的verified字段要为true,否则 VSCode 认为断点无效 - 返回的
source.path必须与 VSCode 当前打开的文件绝对路径完全一致(注意大小写、符号链接、Windows 盘符大小写) - 若调试目标是打包产物,适配器需主动读取并解析
.map文件,把断点位置反向映射回源码行号 —— 这步不能靠 VSCode 自动完成
如何验证 DAP 通信是否真实生效
别只看 UI,直接抓底层消息流最可靠:
- 在适配器启动逻辑中加
process.stdin.on('data', console.log)和process.stdout.write()日志,确认 request 进来、response 出去 - 在
launch.json中加"trace": true,VSCode 会在调试控制台输出完整 DAP 会话(含 request ID、error 字段),比 UI 报错更早暴露问题 - 用
netstat -an | grep 9222(或对应端口)确认 Chrome 远程调试端口是否真被占用 —— 很多“连不上”其实是端口冲突,而非代码逻辑错误
真正卡住的地方往往不在适配器逻辑本身,而在于 VSCode 启动调试会话时,是否把 args 正确透传给了你的子进程,以及子进程是否以阻塞方式等待 stdin。一旦 stdin 流被意外关闭或缓冲区满,DAP 通信就静默中断,没有任何报错提示。











