VSCode attach模式需目标进程预先启用调试支持,Node.js必须启动时加--inspect或--inspect-brk参数,否则V8不开放调试协议;远程调试需正确配置端口、地址及源码路径映射。

VSCode 的 attach 模式不是“连上就行”,它依赖进程必须已开启调试支持(如暴露调试端口、启用 inspector、或挂起等待 attach),否则会提示 Connection refused 或 timeout。
Node.js 进程必须启动时带 --inspect 或 --inspect-brk
没加调试参数的 Node 进程,VSCode 无法 attach——这不是 VSCode 的限制,而是 V8 引擎本身不开放调试协议。
-
--inspect:进程正常启动,同时监听127.0.0.1:9229(默认端口),适合你确定服务已稳定运行后再介入 -
--inspect-brk:进程在第一行就暂停,等 debugger 连上才继续,适合想从入口开始追踪的线上复现场景(但注意:线上环境慎用,可能阻塞请求) - 若需远程 attach(比如容器内 Node),要改绑定地址:
--inspect=0.0.0.0:9229,并确保宿主机能访问该端口(Docker 要加-p 9229:9229,K8s 要开 service 或 port-forward)
launch.json 的 attach 配置关键字段不能少
VSCode 不会自动猜端口或目标进程,type、port、address 和 localRoot/remoteRoot 必须显式对齐。
-
"type": "pwa-node"(新版推荐)或"type": "node"(旧版兼容),不要混用或写错大小写 -
"port": 9229必须和进程启动时指定的端口一致;如果改了(如--inspect=3001),这里也要同步改 - 本地调试远程进程(如 Docker/K8s)时,
"address": "localhost"通常就够用(靠 port-forward 代理),但若走真实网络,得填对方 IP -
"localRoot"和"remoteRoot"是源码映射关键:比如容器里代码在/app,你本地在/Users/me/project,就必须配"localRoot": "${workspaceFolder}"和"remoteRoot": "/app",否则断点不命中
常见失败现象及对应检查点
看到 Could not connect to debug target 或 Timeout waiting for connection,按顺序排查:
- 进程是否真在运行?用
ps aux | grep node或docker ps确认,别只信服务名 - 进程是否带
--inspect*启动?用ps aux | grep inspect直接看命令行参数 - 端口是否被占用或未暴露?本地执行
telnet localhost 9229(或nc -zv localhost 9229),通不了就说明没监听或被防火墙拦了 - VSCode 的
launch.json里port和remoteRoot是否和实际部署路径一致?一个字符错(比如多一个/)都会导致断点灰掉
Python/Go/Java 进程 attach 方式完全不同,不能套用 Node.js 配置
Node.js 的 --inspect 是 V8 特性,其他语言需要各自调试器支持:
- Python:需用
debugpy,进程启动时 import 并调用debugpy.listen(5678),launch.json中"type"改为"python","port"对应设为5678 - Go:用
dlv启动:dlv exec ./myapp --headless --listen=:2345 --api-version=2,VSCode 配"type": "go",端口填2345 - Java:JVM 参数加
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005,VSCode 用java类型调试器,端口5005
跨语言时最容易忽略的是:没有在目标进程里主动启动调试服务,光配 VSCode 是没用的。每个语言的调试协议是独立实现的,不存在通用 attach 接口。


















