vscode远程调试必须用attach模式,因生产环境进程已由systemd等托管运行,无法重启;需确保远程调试器监听0.0.0.0、pathmappings绝对路径映射准确、api版本与端口严格匹配,否则断点静默失效。

为什么 attach 模式是唯一可行方案
生产环境的服务通常由 systemd、supervisord 或容器编排工具(如 Kubernetes)托管,进程早已启动并稳定运行。VSCode 的 launch 模式会尝试在本地或远程新建进程,这在生产中既不可控也不安全。
attach 模式才是正解:它不干预进程生命周期,只通过调试协议连接已存在、且已启用调试监听的进程。
- 填错
"request": "launch"会导致 VSCode 空转或报Failed to launch: could not find program - Node.js 必须用
node --inspect=0.0.0.0:9229 app.js启动,--inspect默认绑定127.0.0.1,远程无法访问 - Python 必须提前注入
debugpy.listen(5678)并调用debugpy.wait_for_client(),不能只靠python -m debugpy启动脚本——那属于 launch 场景 - Go 必须用
dlv exec ./myapp --headless --addr=:2345 --api-version=2 --accept-multiclient,且dlv version输出的 API 版本要和launch.json中"apiVersion"一致
pathMappings 映射错一个字符,断点就永远不命中
VSCode 本地打开的是 /Users/alice/project/main.py,但远程进程加载的是 /opt/myapp/main.py。调试器看到的源码路径是远程路径,而你在本地编辑器里打的断点是基于本地路径的——没有映射,VSCode 根本不知道该把断点翻译成哪一行。
映射必须是绝对路径,且方向不能反:
- Python/Node.js 用
"pathMappings": {"/Users/alice/project": "/opt/myapp"} - Go 用
"remotePath": "/opt/myapp"(注意字段名不同) - 末尾加不加
/会影响匹配:写成"/opt/myapp/"可能导致匹配失败 - 别用
${workspaceFolder}代替实际路径——它在 attach 模式下不展开,会直接当字面量处理
验证方法:启动调试后,在 “CALL STACK” 面板点任意栈帧,看文件路径是否显示为 /opt/myapp/...;如果是 /Users/alice/...,说明映射完全失效。
端口监听地址不是 0.0.0.0,等于没开调试
很多人在服务器上执行了 dlv --headless --addr=:2345,却连不上。根本原因往往是调试器监听的是 127.0.0.1:2345,而不是 0.0.0.0:2345。
检查命令:
ss -tuln | grep :2345
正确输出应含 *:2345 或 0.0.0.0:2345;若只有 127.0.0.1:2345,本地 VSCode 绝对连不上。
- Node.js:必须显式写
--inspect=0.0.0.0:9229,不能省略地址 - Python debugpy:启动时加
--listen 0.0.0.0:5678,不是127.0.0.1:5678 - Go dlv:
--addr=:2345默认监听所有接口,但某些旧版本或容器环境需显式写--addr=0.0.0.0:2345 - 防火墙:确认
sudo ufw status或sudo firewall-cmd --list-ports放行了对应端口
生产环境最易忽略的三个细节
不是配置完就能用。生产环境的特殊性会让很多“本地能跑”的配置当场失效:
- 调试器进程被 OOM Killer 杀掉:dlv/debugpy 占内存较大,生产服务器若内存紧张,可能被系统回收——用
journalctl -u myapp -n 50查日志有没有Killed process - SELinux 或 AppArmor 拦截调试端口:CentOS/RHEL 上
setsebool -P nis_enabled 1或临时setenforce 0测试是否为此类限制 - 代码热更新后路径变更:比如用
touch reload触发 Flask 重载,新进程加载的仍是旧路径,但pathMappings没同步更新,断点立刻失灵
真正卡住人的,往往不是“怎么配”,而是“为什么配对了还不生效”——盯着 ss -tuln 输出、栈帧路径、以及系统日志,比反复改 launch.json 有用得多。











