vscode 的 launch.json 不支持单个配置启动多个 program,需在 configurations 数组中并列定义多个独立调试配置,每个对应一个服务,并通过 compounds 组合启动;断点同步依赖 --inspect-brk 启动后逐个 attach,且须确保 sourcemap 正确生成与映射。

launch.json 里怎么写多个 program?
VSCode 的 launch.json 不支持单个配置里启动多个 program——它一次只调试一个进程。所谓“多靶点同步断点”,本质是同时调试多个 Node.js 进程(比如 user-service、order-service、gateway),每个服务必须有独立的调试配置项。
正确做法是在 configurations 数组里并列定义多个对象,每个对象对应一个服务:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "user-service",
"program": "${workspaceFolder}/services/user/src/index.js",
"cwd": "${workspaceFolder}/services/user",
"env": { "PORT": "3001" }
},
{
"type": "node",
"request": "launch",
"name": "order-service",
"program": "${workspaceFolder}/services/order/src/index.js",
"cwd": "${workspaceFolder}/services/order",
"env": { "PORT": "3002" }
}
]
}
- 每个
name必须唯一,后续在「运行和调试」侧边栏里靠它区分 -
cwd很关键:不设或设错会导致require()找不到模块、process.env读错 .env 文件 - 别共用同一个端口,否则第二个服务启动时会报
EADDRINUSE并静默退出——断点看起来“没反应”,其实是进程根本没起来
如何让多个服务断点真正“同步”触发?
VSCode 本身不提供跨进程断点联动。所谓同步,靠的是人工协调 + 环境配合:先启动所有服务(带 --inspect-brk),再逐个 attach;或者用复合配置(compounds)一键拉起全部,但断点仍需各自设置。
推荐组合方案:
- 所有服务启动命令统一加
--inspect-brk=9229(user)、--inspect-brk=9230(order)等不同端口 - 在
launch.json中为每个服务写一个request: "attach"配置,指定对应port - 用
compounds把它们捆在一起:"compounds": [{ "name": "All Services", "configurations": ["user-service", "order-service"] }] - 点击「All Services」后,VSCode 会依次尝试 attach 到两个端口——但注意:如果某个服务还没启动,attach 会失败且不阻塞另一个
真正“同步停住”的唯一可靠方式:所有服务都用 --inspect-brk 启动,它们会在第一行就挂起;你再逐个 attach,这时每个都停在入口,才具备同步调试基础。
微服务间调用链断点失效?查 sourceMap 和路径映射
当 gateway 调用 user-service,你在 user-service 的 src/controller/user.ts 打了断点,结果停在 dist/controller/user.js 上——说明 source map 链路只在单个服务内生效,跨服务不自动透传。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
每个服务必须独立配好 source map 映射:
- 确保各自
tsconfig.json里"sourceMap": true且"inlineSourceMap": false - 各自
launch.json配置中明确写"sourceMaps": true和匹配自身构建输出的"outFiles"(如"${workspaceFolder}/services/user/dist/**/*.js") - 如果服务代码不在 workspace 根目录下(比如在
services/xxx子文件夹),必须加"resolveSourceMapLocations": ["${workspaceFolder}/services/**/src/**"],否则 VSCode 默认只认根目录下的src
常见坑:outFiles 写成 "./dist/**" —— VSCode 不解析 .,必须用 ${workspaceFolder} 或绝对路径;路径末尾漏了 **,导致只映射一级目录下的 JS。
为什么 attach 模式下断点变空心?
空心红点 = VSCode 找不到对应源码,不是没连上,而是映射失败。在微服务场景下,这通常因为:
- 服务是用
npm run dev启动的,背后可能是nodemon + ts-node,但ts-node默认不生成 .map 文件,也没暴露 source map endpoint - 你 attach 的是已运行进程,但它启动时没加
--enable-source-maps(ts-node需要)或没配tsconfig.json的sourceMap -
launch.json里port填错了,连到了别的进程(比如连上本地开发机的 Docker 容器,但容器里没开 inspect) - 服务用了
cluster模块,主进程和 worker 进程监听的 inspect 端口不同,你 attach 的是 master,但业务逻辑在 worker 里跑
验证方式:在 Debug Console 里输入 process.pid,对比你 attach 时终端打印的 PID;再执行 require('fs').readFileSync('./dist/index.js.map', 'utf8'),看是否真有 map 内容——没有就说明构建阶段就没生成。
微服务调试最耗时间的从来不是写配置,而是确认每个服务的启动方式、构建产物位置、inspect 端口、以及它到底有没有真正加载 source map。别指望一次配全,逐个服务单独验证更稳。










