vscode插件调试async/await需配置skipfiles排除内部路径,断点应设在await下一行而非await行本身,并确保activationevents声明正确、sourcemap有效、使用async函数替代.then()链。

VSCode 插件开发中调试 async/await 代码,不是语法不支持,而是调试器默认会跳进 VS Code 内部的 async_hooks.js 和扩展宿主通信层,导致你根本看不到自己的插件逻辑。
launch.json 必须加 skipFiles 排除 Node 内部路径
VSCode 插件运行在 Electron 主进程或扩展主机(Extension Host)里,底层用的是 Node.js + V8,但调试器一按 F11 就钻进 inspector_async_hook.js 或 internal/async_hooks.js——这不是你该看的地方。
-
skipFiles必须显式配置为["<node_internals>/**"]</node_internals>,不能只写个别文件名,否则漏掉一个就又跳进去了 - 如果用的是
type: "pwa-node"(旧版推荐),要确认 VSCode 版本 ≥ 1.82,否则skipFiles对 ESM 模块无效 - 插件项目若含 TypeScript,
outFiles别设成["./out/**/*.js"]这种宽泛路径,它会干扰 source map 查找;改用resolveSourceMapLocations配置 glob 排除node_modules
断点别打在 await 行本身
await command.execute() 这一行设断点,调试器常停住但变量还没赋值,或者直接跳过——因为 V8 把 await 编译为 microtask 调度点,不是函数调用入口。
- 真正想看结果?断点打在下一行,比如
console.log(result)或if (result) { ... } - 想确认是否真的发出了请求?在
await行右侧空白处右键 → “Add Conditional Breakpoint”,填!result,只在未响应时中断 - 避免在
vscode.commands.registerCommand回调里写长链.then().then(),V8 会内联优化,断点失效;一律改用async函数 +await
插件激活函数里 await 不生效?检查 activationEvents 和 package.json
你在 activate 函数里写了 await vscode.workspace.findFiles(...),但断点就是不停、甚至整个插件没加载成功——大概率是 package.json 里没声明对应激活事件,VSCode 根本没调你的 activate。
-
activationEvents必须包含触发条件,比如"onCommand:myplugin.doSomething"或"workspaceContains:**/.eslintrc.js" - 确保
main字段指向编译后 JS 入口(如./out/extension.js),且该文件存在、有正确sourceMap文件 - 启动调试时,看 VSCode 右下角状态栏是否显示 “Extension Development Host” —— 没出现说明 launch 配置没连上插件宿主
调试器看不到 vscode.window.showInformationMessage 返回值?
这类 API 返回的是 Thenable<string undefined></string>,不是 Promise,但调试器对 Thenable 的 await 支持不稳定。直接 await 它,Variables 面板可能一直显示 Pending,Debug Console 输入变量名也无反应。
- 强制解析:在 Debug Console 里输入
(await msgPromise) || 'timeout'(把msgPromise换成你的真实变量名) - 更稳妥写法:先
const result = await vscode.window.showInformationMessage(...),再在下一行breakpoint()或设断点 - 别在 UI 线程里 await 长耗时操作(如大文件读取),否则阻塞整个 Extension Host;用
vscode.window.withProgress包裹,并设location: vscode.ProgressLocation.Notification
最常被忽略的一点:插件调试依赖 VSCode 自身的调试协议版本和扩展主机的启动方式,不是所有 launch.json 配置都能跨 VSCode 版本复用。哪怕只是升级了 VSCode,也要重新验证 skipFiles 是否仍生效、sourceMaps 是否还能映射到 src/ 下的 TS 文件。











