调用堆栈面板为空不是插件故障,而是调试器未真正挂住执行流;它仅在F5启动调试并命中断点暂停时实时填充,若用Ctrl+F5、断点未命中、sourceMap未启用或异步堆栈未配置,就会显示为空或单层。

调用堆栈面板为什么是空的
不是插件坏了,是调试器根本没挂住执行流。VSCode 的 调用堆栈 面板只在真正暂停时才填充数据——没命中断点、没启动调试会话、或断点被跳过,它就只能显示空或单层(比如 <entry>)。
- 按
F5前确认已选中正确的 launch 配置;Ctrl+F5是运行不调试,不会触发堆栈捕获 - 插件开发常用
Extension Development Host环境,断点必须打在被加载的扩展代码里,而不是主 VS Code 进程的 UI 逻辑中 - TypeScript 插件若未生成 source map 或
launch.json中没设"sourceMaps": true,堆栈会退化成eval at …或匿名函数,无法跳转 - Node.js 插件若用了 ESM(
"type": "module"),需在launch.json加"runtimeArgs": ["--loader", "ts-node/esm"],否则直接崩溃退出,根本到不了断点
如何让 async/await 出现在堆栈里
默认情况下,VSCode 对插件中的异步调用链支持极弱:你看到的往往只是 Promise.then 入口,而非业务函数的完整调用路径。
- 在
launch.json的配置中启用异步堆栈支持:"runtimeArgs": ["--enable-source-maps"] - 显式禁用
skipFiles过滤关键路径,例如删掉或注释掉"<node_internals>/**",否则Promise内部帧会被跳过 - 确保插件入口(如
activate())里实际 await 了目标协程;只创建async function而不 await,它只是个Promise对象,调试器进不去 - Chrome DevTools 协议下,还需手动打开 Settings → Debugger →
Enable async stack traces(该开关直接影响面板是否展开)
插件调试必须改的 launch.json 配置项
VSCode 插件调试依赖 Extension Development Host 启动方式,基础模板常漏关键字段,导致断点失效或堆栈截断。
-
"type": "pwa-node"(推荐)或"type": "node",旧版"type": "pwa-chrome"不适用插件场景 -
"request": "launch"+"program": "${workspaceFolder}/src/extension.ts"(指向真实入口,不是package.json) -
"outFiles": ["${workspaceFolder}/out/**/*.js"]必须匹配编译输出路径,否则 source map 找不到 - TS 插件务必加
"preLaunchTask": "tsc: build - tsconfig.json",否则断点打在 .ts 上不生效 - 避免
"justMyCode": true(尤其调试涉及vscode.window.showQuickPick等 API 时),否则框架封装层全被过滤
点击堆栈项后变量还是旧的
这是最易忽略的交互陷阱:点击某帧只跳转源码,不切换执行上下文。变量面板仍显示暂停时刻的栈帧(通常是顶层),而非你点的那一层。
- 必须在堆栈项上右键 → 选择
切换到帧(Switch to Frame),才能让变量、this、局部作用域全部刷新为该帧状态 - 悬停堆栈项可预览该帧的局部变量快照,但不可编辑或用于计算
- 若某帧显示为
eval或无文件路径,右键选查看原始代码可尝试定位真实位置 - 插件中常见
webview或Web Worker场景,它们有独立 JS 上下文,主进程堆栈里不会出现——得单独 attach 到对应 target


















