VSCode attach调试失败的根本原因是目标Node进程未启用调试接口,必须确保其以--inspect参数启动并在指定端口监听CDP协议,且launch.json中request:"attach"、port、address和protocol:"inspector"严格匹配。

VSCode 调试器不能“监听任意进程”,它只响应符合协议、端口、启动方式三重约束的进程——不满足任一条件,autoAttach 或 attach 都会静默失败。
为什么 attach 到 node 进程总失败
常见现象是点击 Attach to Node.js Process 后列表为空,或选中后立即断开。根本原因不是 VSCode 没扫描,而是目标进程根本没暴露调试接口。
-
node --inspect启动的进程必须在 9229(或配置的 port)上监听 CDP 协议;若端口被占,它会自动递增到 9230、9231……但autoAttach默认只盯 9229 - 用
pm2 start app.js启动?默认不带--inspect,得显式加:pm2 start app.js --node-args="--inspect=9229" - Docker 容器里跑?宿主机连不上
127.0.0.1:9229,得改--inspect=0.0.0.0:9229并映射端口:-p 9229:9229 - 子进程(如
child_process.fork)默认不继承--inspect,需手动传参:fork('./worker.js', [], { execArgv: ['--inspect=9230'] })
launch.json 中 attach 模式怎么配才有效
比起全局 autoAttach,项目级 attach 配置更可控,也更容易对齐实际启动参数。
- 必须设
"request": "attach",不是"launch" -
"port"必须和进程实际监听端口一致,比如node --inspect=9231 app.js,这里就得写"port": 9231 -
"address"默认"localhost",远程调试时要改成宿主机 IP(如"192.168.1.100") -
"protocol": "inspector"是强制项,旧版"legacy"不支持async/await断点,且已被弃用 - 路径映射不是可选:如果进程在容器或远程机器运行,
"localRoot"和"remoteRoot"必须严格匹配源码位置
如何确认 node 进程真正在监听调试端口
别依赖进程名或日志,直接查端口状态——这是最硬的验证手段。
- Linux/macOS:
lsof -i :9229或netstat -tulpn | grep :9229,看到node进程在 LISTEN 状态才算数 - Windows:
netstat -ano | findstr :9229,再用tasklist /fi "pid eq XXXX"确认是不是你的 node 进程 - 进阶验证:用
curl http://127.0.0.1:9229/json,返回 JSON 数组说明 CDP 服务已就绪(内容含webSocketDebuggerUrl) - 如果返回
Connection refused,说明进程没启动、端口错、或用了--inspect-brk但还没人 attach ——它会卡在第一行等连接
真正麻烦的从来不是“怎么连”,而是“连什么”——你得先确保那个进程是带着调试开关活过来的,而不是靠猜或重启碰运气。


















