--disable-extensions是唯一可靠方案,因其在主进程初始化前直接跳过整个扩展加载流程,不读扩展目录、不解析package.json、不触发activate();而GUI禁用仅写配置,无法拦截早期注入的插件。

必须用 --disable-extensions,其他方式都做不到真正“跳过加载”
为什么 --disable-extensions 是唯一可靠方案
VS Code 的插件系统在启动早期就初始化 Extension Host 进程,而图形界面里的“禁用全部扩展”只是往 settings.json 里写配置,根本来不及拦截那些注册了 "onStartupFinished" 或 "*" 激活事件的插件。只有 --disable-extensions 能让主进程直接绕过整个扩展加载逻辑——不读 ~/.vscode/extensions、不解析任何 package.json、不触发 activate() 函数。
常见错误现象:
- 点了“禁用全部扩展”,重启后仍报
Extension host terminated unexpectedly - 在设置里关掉所有插件,打开 Python 文件时
pylance还是悄悄拉起语言服务器 - 用了
--extensions-dir /tmp/empty,但忘了它和--disable-extensions不能共存,结果插件照常加载
--disable-extensions 必须放在命令末尾,且不能混用 --extensions-dir
VS Code 的参数解析器很严格:--disable-extensions 是个全局拦截开关,只有出现在命令行最后,才能确保它覆盖所有后续路径或工作区参数。一旦前面加了 --extensions-dir(比如 code --extensions-dir ~/.vscode/extensions --disable-extensions .),VS Code 会优先尝试从指定目录加载扩展,导致 --disable-extensions 被静默忽略。
正确姿势:
- macOS:
open -n -b "com.microsoft.VSCode" --args --disable-extensions /path/to/project - Linux:
/usr/bin/code --disable-extensions /path/to/project(确认没 alias 覆盖) - Windows PowerShell:
code --disable-extensions "C:\my\project"
错误示例:code --disable-extensions --extensions-dir /tmp/empty . → 插件仍可能加载
GUI 启动绕过所有命令行参数,必须用终端
Windows 用户右键开始菜单图标 → “以管理员身份运行”,或者 macOS 双击 Dock 图标,这些 GUI 启动方式完全不走命令行,--disable-extensions 参数压根不会被读取。你看到的还是带插件的 VS Code。
所以排查崩溃或冲突时,务必:
- 关掉所有 VS Code 实例(包括后台渲染进程)
- 从终端/PowerShell 启动,不要依赖快捷方式或桌面图标
- 如果要用图形化方式快速启动,得手动修改快捷方式目标(Windows)或创建 AppleScript(macOS)来包裹命令
验证是否生效:启动后按 Ctrl+Shift+P 输入 Developer: Show Running Extensions,列表应为空;再打开 Developer: Toggle Developer Tools → Console,不应看到任何 extensionHostProcess.js 相关错误。
想临时禁用部分插件?用 --disable-extension 更精准
当安全模式下问题消失,说明确实是插件引发的,这时别全关再一个个开——用 --disable-extension 逐个排除更高效,尤其适合连插件面板都打不开的情况:
- 先列出所有已装插件:
code --list-extensions - 禁用单个测试:
code --disable-extension ms-python.python /path/to/project - 一次禁用多个:
code --disable-extension esbenp.prettier-vscode --disable-extension dbaeumer.vscode-eslint .
注意:--disable-extension 只对本次启动生效,不影响插件文件本身;它比改 settings.json 更早介入,能捕获那些“还没来得及写配置就被激活”的插件。
真正容易被忽略的是:某些插件(比如旧版 SFTP、AI 补全类)会在启动时尝试 spawn 外部进程,而路径含空格、中文或权限不足会导致静默失败——这种错误不会弹窗,只藏在 exthost 日志末尾或系统级进程里,必须靠命令行参数才能暴露出来。


















