必须在「extension development host」窗口中打开 devtools才能调试插件,该窗口由f5启动,标题栏含[extension development host],按ctrl+shift+i或通过命令面板开启;console.log输出位置取决于执行时机:模块加载时报错出现在主窗口devtools,activate()中则在开发主机窗口devtools,最可靠的是写文件日志;断点不命中多因sourcemap未启用、路径不匹配、activationevents未触发或异步回调时机不当;插件崩溃看「extension host terminated」提示,查log (extension host)频道或exthost日志文件。

VSCode 自研插件调试失败,八成卡在「没进对进程」——你打开的 DevTools 是渲染进程的,而插件逻辑跑在主进程(extension host)里,两者完全隔离。直接按 Ctrl+Shift+I 看到的 Console 根本访问不到 vscode API,也看不到你的 console.log。
怎么打开真正能调试插件的开发者工具
必须在「Extension Development Host」窗口中打开 DevTools,而不是你日常用的那个主 VSCode 窗口。
- 按
F5启动插件调试(确保项目根目录含package.json和src/extension.ts),会弹出一个新窗口,标题栏带[Extension Development Host] - 在这个新窗口里,再按
Ctrl+Shift+I(Win/Linux)或Cmd+Option+I(macOS)——这才是插件运行上下文的 DevTools - 或者用命令面板:
Ctrl+Shift+P→ 输入Developer: Toggle Developer Tools,效果一样
如果快捷键无效,先确认焦点是否在该窗口内;某些键盘管理工具(如 Karabiner、PowerToys)可能劫持了组合键。
为什么 console.log 不显示,以及该往哪看
console.log 有三个去处,取决于执行时机和上下文:
- 插件激活前(如模块加载时报错):只出现在主 VSCode 窗口的 DevTools
Console里(Help → Toggle Developer Tools) - 插件已激活且在
activate()或命令回调中:输出到「Extension Development Host」窗口的 DevToolsConsole,但仅当该窗口的 DevTools 已打开 - 更可靠的方式是写文件日志:
require('fs').appendFileSync('./debug.log', `[${new Date().toISOString()}] ${msg}\n`),尤其适合查activate()前的初始化失败
别依赖 Debug Console 面板——它只显示调试器附加时的评估结果,不是插件运行时的标准输出流。
断点不命中?先检查这三件事
断点灰掉或从不触发,基本不是代码问题,而是环境链路断了:
-
tsconfig.json中没开"sourceMap": true,或outDir与launch.json的outFiles路径不匹配(例如写成./dist/**/*.js但实际编译到./out/) -
activationEvents没覆盖触发动作:比如只写了["onCommand:myext.do"],但你没在命令面板里手动执行该命令,activate()就根本不会跑 - 断点打在异步回调里(如
.then()、setTimeout),调试器还没加载完上下文;换成await+debugger更稳
注意:deactivate() 里的断点几乎不可能自动触发——VSCode 不会主动卸载你正在调试的插件。
插件“没反应”时最该查的日志位置
右下角出现黄色感叹号「Extension host terminated」?那是最直接的崩溃信号。
- 打开命令面板 → 运行
Developer: Open Logs Folder,进exthost子目录,找最新时间戳的exthost*.log文件 - 或在「Output」面板中切换到
Log (Extension Host)频道,这里记录了插件加载、激活、报错的完整流水 - 如果
contributes.commands拼错 ID(大小写敏感)、main字段指向不存在的 JS 文件、或activationEvents写成onLanguage:pyhton(少个t),VSCode 全部静默忽略,只在日志里留一行警告
最容易被忽略的一点:插件逻辑写在 src/extension.ts 顶层(非函数内)时,任何语法错误或 require 失败,都会导致整个模块加载中断,且不抛异常——只能靠日志里的 Activating extension 'xxx' failed 定位。











