必须设"request":"launch"、"outfiles"指向编译后js文件、"skipfiles":["/**"],并启用"runtimeargs":["--extensiondevelopmentpath=${workspacefolder}"]。

调试前必须开启的 launch.json 配置项
VSCode 插件调试失败,八成是因为 launch.json 里漏了关键字段。默认生成的配置常缺 "outFiles" 或错配 "request" 类型,导致断点不命中、源码映射失效。
- 必须设
"request": "launch"(不是"attach"),否则无法触发插件激活逻辑 -
"outFiles"要指向编译后文件,比如["${workspaceFolder}/out/*<em>/</em>.js"];若用 TypeScript 但没生成.js.map,断点会直接失效 - 加上
"skipFiles": ["<node_internals>/**"]</node_internals>,避免误停在 Node 内部代码里 - 若插件依赖工作区上下文,记得启用
"runtimeArgs": ["--extensionDevelopmentPath=${workspaceFolder}"]
日志输出不显示?检查 console.log 的作用域和时机
插件里的 console.log 在多数情况下根本不会出现在开发者工具控制台——因为主进程、扩展宿主进程、Webview 等运行在不同上下文中,日志默认被隔离。
- 主进程(即
extension.ts的顶层)日志走 VSCode 开发者工具的「Console」面板,但仅当插件已激活且未崩溃 - 激活前的日志(如模块加载时报错)只能通过
Developer: Toggle Developer Tools→ 「Console」查看,或改用vscode.window.showInformationMessage()强制弹出 - 更可靠的方式是写入文件:
require('fs').appendFileSync('./debug.log', <code>[${new Date().toISOString()}] ${msg}\n),尤其适合调试activate()前的初始化逻辑
断点失效的三个高频原因
断点灰掉或不触发,不是 VSCode 问题,基本是环境链路断了。
- TypeScript 编译未启用
sourceMap: true(tsconfig.json中),或outDir与launch.json的outFiles不匹配 - 插件未真正激活:检查
package.json的activationEvents是否覆盖了你的触发动作(比如用了"onCommand:myext.do",但调试时没手动执行该命令) - 断点打在异步回调里(如
then()、setTimeout),而调试器还没加载完上下文——换成await+debugger语句更稳
如何快速定位“插件没反应”类问题
用户点击命令无响应、右键菜单不出现、状态栏图标缺失……这类问题往往卡在声明层或生命周期前端。
- 先看 VSCode 右下角是否有黄色感叹号提示「Extension host terminated」,有则打开「Output」面板,选「Log (Extension Host)」查堆栈
- 检查
package.json的contributes.commands是否拼错command字符串,VSCode 不报错但静默忽略 - 用
Developer: Inspect Context Keys查当前编辑器是否满足when条件(比如editorTextFocus && resourceLangId == 'json',但你正在编辑的是.ts文件) - 在
activate()开头加一句console.log('activated:', context.extension.id),确认函数至少被执行了一次
调试插件时,最耗时间的往往不是逻辑错误,而是搞不清“这段代码到底有没有跑”。把日志路径、断点位置、激活条件这三件事对齐,能省下大半排查时间。











