远程调试必须用 attach 而非 launch,因实际进程运行在远端;需远程启动调试器(如 debugpy/dlv/node --inspect)并监听 0.0.0.0,本地通过 pathmappings 正确映射路径,且确保端口转发与防火墙策略就绪。

远程调试必须用 attach,不能写 launch
VSCode 远程调试不是在本地起进程,而是连接远端已运行的调试服务。配置里写 "request": "launch" 会静默失败或断点完全不生效——因为本地根本没执行代码。
正确做法是:远程先手动启动调试器(比如 debugpy、dlv、node --inspect),本地配置只做 attach 连接。
- Go:远程跑
dlv --headless --listen=:2345 --api-version=2 --accept-multiclient exec ./myapp - Python:远程跑
python -m debugpy --listen 0.0.0.0:5678 --wait-for-client myscript.py(注意是0.0.0.0,不是127.0.0.1) - Node.js:远程跑
node --inspect=0.0.0.0:9229 app.js
验证是否监听成功:远程执行 ss -tuln | grep :端口号,输出中必须含 *:端口 或 0.0.0.0:端口,否则本地连不上。
pathMappings 填反了、少斜杠、用相对路径,断点就全失效
VSCode 本地打开的是 /Users/you/project/main.py,但远程加载的是 /home/ubuntu/app/main.py——路径不映射,VSCode 根本不知道该把断点打到哪行,哪怕文件名一模一样。
pathMappings 是对象,格式为 {"本地绝对路径": "远程绝对路径"},方向不能反,末尾斜杠不能多也不能少,相对路径一律无效。
- Python 示例:
"pathMappings": {"/Users/alex/myproj": "/home/ubuntu/myproj"} - Go 示例:
"pathMappings": {"/Users/alex/go/src/myapp": "/root/src/myapp"}
检查是否生效:调试启动后,在 VSCode 的 CALL STACK 面板点任意栈帧,看显示的文件路径是不是远程路径;如果不是,说明映射失败。
端口转发失败,90% 是远程服务没监听 0.0.0.0
VSCode 的端口转发(无论是 Remote-SSH 的 Forward a Port,还是 devcontainer 的 forwardPorts)本质是建立 SSH 隧道,流量最终要落到远程服务的监听地址上。
如果远程服务只绑定了 127.0.0.1:3000,那即使 VSCode 转发成功,请求也进不去——因为 127.0.0.1 只接受本机回环访问,而 SSH 隧道过来的流量来源是 localhost(即远程主机自身),但走的是网络栈,不是回环设备。
- Web 框架要显式指定 host:
app.run(host='0.0.0.0', port=3000)(Flask)或server.listen(3000, '0.0.0.0')(Express) - 数据库如 PostgreSQL,确认
postgresql.conf中listen_addresses = 'localhost,127.0.0.1'改成'0.0.0.0',且pg_hba.conf允许本地连接
验证方式:远程执行 curl -v http://0.0.0.0:3000 和 curl -v http://127.0.0.1:3000,两者都应返回正常响应。
devcontainer 自动转发 vs Remote-SSH 手动转发,适用场景不同
devcontainer.json 里的 forwardPorts 是容器启动时自动触发的,适合开发环境固定、端口明确的场景(比如前端 3000、后端 8000、DB 5432)。它通过 VSCode Server 建立反向隧道,左下角状态栏直接显示,点击就能开浏览器。
而 Remote-SSH 的 Forward a Port 是连接后按需添加,适合临时调试、端口不固定、或需要从宿主机其他工具(如 curl、Postman)直连的情况——但它只对当前窗口有效,关掉就断,也不支持宿主机命令行直接访问。
- 要让
curl http://localhost:3000在本地终端生效?必须补runArgs:"runArgs": ["-p", "3000:3000"] - 想每次连 SSH 都自动转发?得在
~/.ssh/config里加LocalForward 5432 localhost:5432,且必须重启连接才加载
最容易被忽略的一点:VSCode 的端口转发不解决服务本身的访问控制。比如远程开了防火墙(ufw)、SELinux、或云服务器安全组没放行对应端口,转发也会卡在连接拒绝阶段——先确认 telnet 远程IP 端口 能通,再排查 VSCode 配置。











