必须将"autoattachchildprocesses": true显式配置在launch.json中,否则vs code无法自动附加worker threads或child_process.fork()创建的子进程,导致断点为空心、调用栈缺失、变量面板空白;该配置是硬性前提,仅设--inspect-brk参数无效。

autoAttachChildProcesses 必须为 true,否则 Worker 和 fork 子进程根本不会被 VS Code 附加——断点变空心、调用栈不出现、变量面板空白,不是配置漏了,是调试器压根没看到它们。
Worker Threads 调试失败?先确认 launch.json 里开了 autoAttachChildProcesses
VS Code 默认只调试主线程,new Worker() 创建的线程不会自动进入调试上下文。这不是 Bug,是设计行为。
-
"autoAttachChildProcesses": true是硬性开关,必须显式写在launch.json的 Node.js 配置项里,不能靠继承或全局设置 - 仅启用
"runtimeArgs": ["--inspect-brk"]不够——它只让主线程监听调试端口,不触发子线程附加逻辑 - 如果 Worker 启动极快(比如纯计算型),建议在 worker 入口加
parentPort?.postMessage('ready'),主线程监听后才继续后续逻辑,避免断点错过 - 路径写错会导致断点绑定失败:用
path.resolve(__dirname, 'worker.js')替代./worker.js,防止process.cwd()变动影响解析
child_process.fork() 子进程没反应?execArgv 没传就是白搭
fork() 不像 spawn() 自带环境继承,它默认完全不开启调试能力。VS Code 无法凭空发现一个没暴露调试端口的子进程。
ZenHeart zenlink 与 zenlink-mcp 为 OpenClaw,涵盖安装、MCP 注册、钩子接线、入站轮询及升级维护。
- 错误写法:
fork('./sub.js')—— 子进程无--inspect参数,autoAttachChildProcesses彻底失效 - 正确写法:
fork('./sub.js', [], { execArgv: ['--inspect=9230'] }),端口号需与launch.json中port字段一致(或留空让 Node 自选) - 若多个子进程共用同一端口(如都用
9229),调试器只会连上第一个,其余被拒绝——要么动态分配端口,要么确保每个fork实例使用唯一值 - 用
ts-node或esbuild-node启动主进程时,autoAttachChildProcesses会失效,因为它们绕过了标准 Node 启动流程;此时必须改用原生node启动,或手动 attach
macOS/Linux 下 nvm 用户常踩的坑:子进程用了错误的 Node 版本
nvm 切换版本只影响当前 shell,VS Code 启动时若未从 shell 启动(比如通过 Dock 或 Spotlight),它会读取系统默认 Node,导致主进程和子进程 Node 版本不一致,execArgv 参数被忽略或报错。
- 解决方法:在
launch.json中显式指定"runtimeExecutable",例如:"runtimeExecutable": "/Users/xxx/.nvm/versions/node/v18.18.2/bin/node" - 验证方式:在子进程中加
console.log(process.version),对比主进程输出是否一致 - 不要依赖
which node输出——VS Code 的进程树中,子进程的PATH可能未继承 nvm 的 alias 配置
sourceMap 错位、断点变空心?检查 outFiles 和 worker 文件可见性
Worker 文件被 .gitignore 或 files.exclude 隐藏,或打包后路径映射错误,都会导致 VS Code 找不到源码位置,断点无法绑定。
- 确保
worker.js在工作区根目录下,且未被files.exclude掩盖(可在 VS Code 设置中搜files.exclude检查) - TypeScript 项目必须配
"sourceMaps": true和"outFiles": ["./dist/**/*.js"],路径要和实际输出结构严格匹配 - 如果用
esbuild打包,需加--sourcemap=inline或--sourcemap=external,并确保outFiles能 glob 到生成文件 - 断点图标为空心圆时,悬停提示 “Breakpoint ignored because generated code not found” —— 这不是 Worker 问题,是 sourceMap 解析失败
new Worker() 就自动进调试上下文;实际上它和 fork() 一样,极度依赖 execArgv + autoAttachChildProcesses + 正确的路径与 sourceMap 三者协同。少一个,就只剩 console.log。










