如何在VSCode Extension Host启动时自动附加LSP调试器,无需手动操作
VSCode LSP启动阶段调试解决方案
前置准备
首先确保编译配置开启sourcemap输出,避免只能调试打包后代码的问题:
- tsconfig.json中设置
"sourceMap": true - webpack配置中设置
devtool: 'source-map',不要使用eval类的devtool配置,打包后将map文件和编译后的js文件放在同一路径下
方案1:配置LSP启动等待调试器附加
修改扩展中LSP实例的初始化配置,给LSP进程增加inspect断点参数,实现启动时自动暂停等待调试器连接:
- 在
LanguageClient的serverOptions debug配置中增加execArgv参数,指定调试端口和sourcemap开启参数:
const serverOptions = { run: { module: serverModule, transport: TransportKind.ipc }, debug: { module: serverModule, transport: TransportKind.ipc, options: { // 自定义调试端口,启动后会在第一行代码暂停等待调试器连接 execArgv: ['--inspect-brk=9229', '--enable-source-maps'] } } }; const client = new LanguageClient('你的LSP标识', 'LSP名称', serverOptions, clientOptions);
- 在
.vscode/launch.json中新增LSP附加调试配置:
{ "type": "node", "request": "attach", "name": "Attach to LSP", "port": 9229, "restart": true, "sourceMaps": true, // 替换为你打包后LSP服务端代码的存放路径 "outFiles": ["${workspaceFolder}/dist/server/**/*.js"] }
启动扩展调试后,再运行该附加配置,即可从LSP入口代码开始调试,不会错过启动阶段逻辑。
方案2:配置复合启动实现自动附加
无需手动触发两次调试操作,配置复合启动项即可同时启动扩展和自动附加LSP调试器:
在.vscode/launch.json中增加复合配置项:
{ "version": "0.2.0", "configurations": [ // 你原有的扩展启动调试配置,名称为Launch Extension { "name": "Launch Extension", "type": "extensionHost", "request": "launch", "args": ["--extensionDevelopmentPath=${workspaceFolder}"], "preLaunchTask": "npm: watch" }, // 方案1中新增的Attach to LSP配置 { "type": "node", "request": "attach", "name": "Attach to LSP", "port": 9229, "restart": true, "sourceMaps": true, "outFiles": ["${workspaceFolder}/dist/server/**/*.js"] } ], "compounds": [ { "name": "Launch Extension + Debug LSP", "configurations": ["Launch Extension", "Attach to LSP"], "stopAll": true } ] }
直接选择该复合配置启动,VSCode会自动完成扩展启动、LSP调试器附加的全流程,全程无需手动操作。
方案3:修复autoAttachChildProcesses无效问题
如果你想要使用自带的自动附加能力,可按以下步骤排查修复:
- 按
Ctrl+Shift+P(Mac为Cmd+Shift+P)调用命令面板,执行Debug: Toggle Auto Attach,选择Smart模式 - 在你的extensionHost启动配置中新增
"autoAttachChildProcesses": true - 重启VSCode后重新启动调试会话即可生效,无需单独配置调试端口
内容的提问来源于stack exchange,提问作者Aubrey Stearn
相关产品推荐
相关产品推荐

