远程调试连不上90%是端口未对齐:远程服务未暴露、VSCode未转发、防火墙/SSH隧道拦截,且remoteRoot与localRoot路径映射必须严格一致,Node.js需绑定0.0.0.0,Python需debugpy.listen(("0.0.0.0", port)),Xdebug需设client_host为本地真实IP。
远程调试连不上,90% 是端口没对齐——不是本地没监听,而是远程服务没暴露、VSCode 没转发、防火墙/SSH 隧道又拦了一道。
remoteRoot 和 localRoot 映射错一个字符,断点就永远不命中
VSCode 断点依赖源码路径严格一对一匹配。容器里报
,你却在
里写
对应
,看着合理,但只要本地路径实际是
,而容器挂载的是
,中间差个
子目录,断点就失效。
进容器执行
和
,确认代码真实根路径
中必须显式写死
,别信
自动推导
Node.js 调试时,
比
更可靠,尤其在 monorepo 或符号链接场景下
Python + debugpy 用
,格式为
,注意键是本地路径、值是远程路径
Node.js 的 --inspect 必须绑定 0.0.0.0,不是 127.0.0.1
写
看似没错,但默认绑定
,只允许本机回环访问。VSCode 在本地通过 SSH 隧道或直接连接时,实际是从宿主机 IP(比如
)发起请求,根本连不到
。
正确启动命令:
验证是否生效:进服务器执行
,输出中必须含
Docker 容器内启动,还要加
(或 devcontainer.json 中
)
云服务器记得开安全组——端口放行对象是你的本地公网 IP,不是
Python debugpy.listen() 绑定地址和 launch.json 的 connect.host 必须一致
debugpy 默认监听
,和 Node.js 一样,这会导致 VSCode 连接超时。很多人改了 Python 代码却忘了同步改
,或者反过来。
VSCode 1.118
微软正式发布 Visual Studio Code 1.118 版本 。本次更新重点强化了 AI 开发体验与企业管理能力,其中最引人注目的是新增 Copilot CLI 远程控制功能,允许开发者通过手机或网页远程监控和接管 AI 会话 。同时,为了提高 AI 的运行性价比,新版本优化了令牌缓存策略以降低成本 。此外,1.118 版还引入了 Chronicle 本地历史追踪、TypeScript 7.0 支持以及更严格的企业级访问管控 。
下载
Python 启动代码必须写成:
中对应配置:
是指“从 VSCode 所在机器看的 localhost”,即 SSH 隧道终点或容器端口转发后的本地地址,不是远程服务器上的
如果用 SSH 隧道(
),
就填
;如果直连远程 IP,则填该 IP
PHP Xdebug client_host 写成本地公网 IP,不是 127.0.0.1
PHP 调试走的是反向连接:Xdebug 主动连回本地 VSCode。所以
必须设为你运行 VSCode 的那台机器的真实 IP(比如家庭宽带出口 IP 或公司内网 IP),设成
只在本地开发有效,远程必失败。
查本地 IP:Mac/Linux 执行
,Windows 执行
php.ini 中必须写:
(换成你的真实局域网 IP)
若本地是 NAT 环境(如公司防火墙后),需配 SSH 端口转发:
,再把
改成
,
保持
VSCode 的
设置必须和
一致,且 PHP Debug 插件要启用
端口转发不是“配了就通”,它是一条链路:远程服务监听 → 容器/Docker 网络暴露 → SSH 隧道或 VSCode Ports 转发 → 本地防火墙放行 → VSCode 调试器连接地址与端口完全匹配。漏掉任意一环,断点都只是灰色空心圆。
/app/server.jslaunch.json"remoteRoot": "/app""localRoot": "${workspaceFolder}"/Users/me/project/appsrcpwdls -l /applaunch.json"remoteRoot": "/app"sourceFileMappathMappingsremoteRoot/localRoot"pathMappings"{"${workspaceFolder}": "/app"}node --inspect=9229 server.js127.0.0.1:9229192.168.1.100127.0.0.1node --inspect=0.0.0.0:9229 server.jsnetstat -tuln | grep :92290.0.0.0:9229-p 9229:9229"forwardPorts": [9229]0.0.0.0/0127.0.0.1launch.jsondebugpy.listen(("0.0.0.0", 5678))launch.json
{
"name": "Attach to Remote",
"type": "python",
"request": "attach",
"connect": {
"host": "localhost",
"port": 5678
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "/home/user/myproject"
}
]
}
"host": "localhost"localhostssh -L 5678:localhost:5678 user@serverhostlocalhostxdebug.client_host127.0.0.1ipconfig getifaddr en0ipconfig | findstr IPv4xdebug.client_host=192.168.1.100ssh -R 9003:localhost:9003 user@serverxdebug.client_host127.0.0.1xdebug.client_port9003php.debug.portxdebug.client_port