子进程断点不触发是因为VSCode默认只调试主进程,子进程需显式启用--inspect并配置autoAttachChildProcesses:true,且端口不能重复、必须由主进程直接fork/spawn。

为什么子进程断点不触发
VSCode 默认只 attach 到主 Node 进程,child_process.fork() 或 spawn() 启动的子进程是独立进程,没有启用 --inspect 参数,调试器根本连不上。你打的断点在子进程里,但 VSCode 根本不知道它存在——不是断点写错了,是调试会话压根没覆盖到它。
启用 autoAttachChildProcesses 必须配对生效
VSCode 从 1.58+ 支持自动附加子进程,但必须同时满足三个条件,缺一不可:
-
"type": "node"(不能用pwa-node,老项目或 CI 场景下pwa-node可能 fallback 失败) -
"request": "launch"(attach模式不支持 autoAttach) - 在
launch.json中显式开启:"autoAttachChildProcesses": true
注意:autoAttachChildProcesses 不是全局开关,它只对当前 launch 配置生效;如果你用 npm start 启动,而 package.json 里没加 --inspect-brk,主进程都没进调试模式,子进程更不可能被 attach。
子进程启动时必须带 --inspect 参数
即使开了 autoAttachChildProcesses,如果子进程自己没暴露调试端口,VSCode 也无从 attach。常见错误写法:
-
fork('./worker.js')→ 子进程无--inspect,断点失效 -
spawn('node', ['worker.js'])→ 缺少--inspect和端口分配,冲突或静默失败
正确做法(推荐):
fork('./worker.js', [], {
execArgv: ['--inspect=0.0.0.0:9230']
});
或用 spawn 显式传参:
spawn('node', ['--inspect=0.0.0.0:9230', 'worker.js']);
⚠️ 端口不能重复:主进程默认用 9229,子进程得换一个(如 9230、9231),否则 EADDRINUSE 导致子进程崩溃,VSCode 看不到任何日志,只显示“断点未命中”。
调试多个子进程时容易忽略的细节
VSCode 的 autoAttachChildProcesses 是“尽力而为”,但有明确限制:
- 只 attach 由当前主进程直接 fork/spawn 的子进程,不递归 attach 孙进程
- 子进程必须在启动后 5 秒内暴露调试端口,超时即放弃(可调
"timeout": 10000) - Windows 下若子进程用
cmd /c node ...包裹,VSCode 无法识别为 Node 子进程,autoAttach失效 - Node ≥ 14 才保证
async_hooks稳定,低于此版本可能漏掉部分子进程
真正复杂的场景(比如 worker_threads + child_process 混用),别依赖自动 attach——改用 --inspect-brk + 手动 attach 更可控,且能在子进程第一行就停住。


















