vscode每个configuration仅支持一个调试会话,因调试器需精确控制进程生命周期、端口绑定与断点注入;单配置内写多个program或拼接命令会被忽略或报错,必须用compounds组合多个独立配置。

不能靠单个 configuration 启动多个进程,必须用 compounds 组合多个已定义的调试配置——这是唯一可靠方式。
为什么直接在一个 configuration 里写两个 program 会失败
VSCode 的每个 configuration 只能启动一个调试会话。如果你在同一个对象里填两个 program、或试图用 && 拼接命令,VSCode 会忽略第二个,甚至报错 Invalid launch configuration。这不是限制,而是设计:调试器需要精确控制进程生命周期、端口绑定、断点注入和变量作用域。
-
request: "launch"类型只允许一个可执行入口(如program或module) -
request: "attach"类型必须指向一个已运行、且暴露了调试端口的进程 - 混合
type: "node"和type: "chrome"在同一配置中——语法不合法,VSCode 校验直接拒绝加载
怎么写 compounds 才能真正“同时启动”
compounds 是 launch.json 的顶层字段,它不启动新进程,而是按需触发多个已定义的 configurations。关键在顺序控制与就绪判断:
- 所有被引用的
name必须已在configurations数组中正确定义,拼写大小写敏感 - 默认是并行启动(即 VSCode 不等待 A 完成再启 B),但
attach类型会自动重试连接,直到目标端口响应 - 如果前端依赖后端 API 就绪,建议后端用
request: "launch"+preLaunchTask启动服务,前端用request: "launch"+type: "chrome",并在compounds中把后端配置放前面(顺序影响 UI 下拉菜单排列,不影响实际并发)
示例 compounds 片段:
{
"compounds": [
{
"name": "Full Stack: Dev",
"configurations": ["Backend: Flask", "Frontend: Chrome"]
}
]
}
常见卡点:端口冲突、attach 失败、断点不命中
这些不是配置写错了,而是进程间协调没到位:
- 两个
configuration如果都设"port": 5000,第二个会因地址已被占用而失败,错误信息藏在调试控制台里,不是弹窗提示 -
request: "attach"连不上?先确认目标进程是否真加了--inspect=9229(Node)或-m debugpy --listen 5678(Python),再检查address和port是否匹配 - Python 多进程/多线程断点失效?每个用到
multiprocessing或threading的configuration都得单独加"subProcess": true和"justMyCode": false,缺一不可
tasks.json 和 launch.json 怎么分工
别混用:tasks.json 负责“跑起来”,launch.json 负责“调进去”。比如你有三个服务,其中两个只需终端输出(如日志监听器、消息队列消费者),它们适合放进 tasks.json 并设 "isBackground": true;剩下那个要下断点、看调用栈的服务,才放进 launch.json 并配 compounds。
-
tasks.json里的任务可以用"dependsOn"控制启动依赖,但无法 attach 调试器 -
launch.json里的preLaunchTask可以调用tasks.json中的任务,用于“先拉起服务,再 attach”这种场景 - 跨平台兼容性:Windows 上
start /b、macOS/Linux 上python script.py &这类 shell hack 不进tasks.json就容易出问题,优先用"type": "shell"+ 显式command
最易被忽略的是:VSCode 不会自动同步不同 configuration 的 Python 解释器路径。即使你在命令面板选了某个虚拟环境,每个 configuration 仍需手动指定 "python" 字段或确保 python.defaultInterpreterPath 全局设置准确——否则可能一个用 conda 环,另一个用系统 Python,导入失败都不报在调试面板里。











