auto attach 是 vscode 监听终端中手动启动的 node 子进程(如 node app.js、npm start)的调试功能,需设为 smart 模式,仅捕获当前工作区下带 --inspect 参数的进程,不扫描已有进程或 ide 内部启动。

Auto Attach 是什么,什么时候该开
它不是“自动连上所有 Node 进程”,而是监听 node 命令启动的子进程——只对终端里手动敲 node app.js、npm start(背后调用 node)这类场景有效。VSCode 不会去扫描系统里已存在的 node 进程,也不会拦截 IDE 内部的调试启动(比如 F5 启动)。如果你在脚本里用 child_process.spawn('node', [...]) 启动,也默认不被捕获,除非显式加 --inspect 参数。
必须打开 Auto Attach 并设为 smart 模式
VSCode 默认是 off,得手动改。打开设置(Ctrl+,),搜 debug.javascript.autoAttachFilter,把它设成 smart。别选 always:它会让 VSCode 尝试 attach 所有 node 进程,包括你全局装的 npx、pnpm 甚至某些编辑器插件起的 node 辅助进程,极易卡死或弹无数调试窗口。
-
smart模式只捕获当前工作区路径下启动的、带--inspect或--inspect-brk的进程(哪怕没显式写,Node v14+ 在node启动时也会自动加--inspect) - 如果项目用
ts-node或nodemon,确保它们版本较新(nodemon@3.0+、ts-node@10.9+),老版本可能绕过 inspect 参数传递 - Windows 下 PowerShell 有时会吞掉
--inspect参数,换cmd或Git Bash更稳
终端里启动前确认环境和参数
Auto Attach 不是魔法,它依赖 Node 进程启动时暴露调试端口。常见失败是因为:
- 用了
node --require ts-node/register app.ts这类写法:Node 先加载ts-node,再执行 TS 文件,但--inspect可能没传给实际运行时。改用node -r ts-node/register --inspect app.ts - 脚本里写了
process.execArgv.push('--inspect=0.0.0.0:9229'):Auto Attach 默认只认localhost地址,得同步改 VSCode 设置debug.javascript.autoAttachPort为9229,否则连不上 -
npm start脚本里用了cross-env NODE_OPTIONS=--inspect:某些旧版 npm 会丢掉这个环境变量,直接在 script 里写"start": "node --inspect index.js"更可靠
Attach 上了却断点不命中?检查 sourcemap 和入口路径
Auto Attach 成功后,断点灰掉或不触发,大概率不是 attach 失败,而是调试器找不到源码映射:
- TS 项目必须生成
.js.map文件,且tsconfig.json中sourceMap和inlineSourceMap至少一个为true;若用outDir,还得配rootDir和mapRoot,否则 VSCode 在outDir里找不到对应 .ts 路径 - 如果入口文件是
dist/index.js,但断点打在src/index.ts,需确认sourceRoot字段指向正确(比如"sourceRoot": "../src"),否则 map 文件里的路径解析会错位 - 用
nodemon时,重启后旧调试 session 不会自动重连,得等下一个node进程起来再 attach——这不是 bug,是设计如此
最常被忽略的一点:Auto Attach 只响应“终端里新启动”的进程,不接管已运行的进程,也不处理 fork 出来的 worker 线程。想 debug worker,得单独配 worker_threads 支持,或者改用 node --inspect --experimental-worker 启动主进程。











