vscode attach模式需同时满足进程调试就绪、通道匹配和权限合法三条件:python须用python -m debugpy --listen 5678 --wait-for-client启动并端口一致,launch.json设"request":"attach"及正确host/port,justmycode=false方可进入第三方库;gdb/lldb附加必须pid与program路径完全匹配且带调试符号;node.js子进程需显式启用--inspect-brk,autoattachchildprocesses在attach模式下无效。

VSCode 的 attach 模式不是“连上就行”,而是必须匹配进程状态、调试通道和权限三者——缺一不可。
Python 用 debugpy 监听端口,VSCode 通过 host:port 连接
Python 本身不带调试服务,得靠 debugpy 显式开启监听。你不能只改 launch.json 就完事,必须让目标进程真实跑在调试模式下:
- 启动命令必须加
python -m debugpy --listen 5678 --wait-for-client,端口号要和launch.json中connect.port一致 -
host填"localhost"(本地)或具体 IP(远程),别留空或写错成"127.0.0.1"和"localhost"在某些 Docker 或 SSH 场景下行为不同 -
justMyCode设为false才能进numpy、torch等库源码;设为true(默认)时第三方调用直接跳过,断点会灰掉 - 如果程序启动后立刻退出,加
--wait-for-client能卡住等待 VSCode 连接,避免错过时机
示例 launch.json 片段:
{
"name": "Python Attach",
"type": "debugpy",
"request": "attach",
"connect": {
"host": "localhost",
"port": 5678
},
"justMyCode": false
}
GDB/Lldb 附加必须填对 PID 和 program 路径
VSCode 不是直接 attach,它只是把 gdb 或 lldb 的 attach 命令封装了一层。配置错一个字段,断点就无效:
-
processId(GDB)或pid(LLDB)必须是当前运行中进程的真实 PID,推荐用"${command:pickProcess}"交互选择,别手输——输错一个数字就失败 -
program字段不是可选的,必须指向**和 /proc//exe 完全一致的二进制文件**,包括绝对路径。用 ls -l /proc/<pid>/exe</pid>对比确认 - 确保二进制带调试符号:
readelf -S ./myapp | grep '\.debug'应有输出;被strip过的文件无法展开变量 - 普通用户无法 attach root 进程,
ptrace_scope为 1 时会报Operation not permitted;临时放开用sudo sysctl -w kernel.yama.ptrace_scope=0
Node.js 子进程不自动被 attach,得手动开调试端口
autoAttachChildProcesses 是个常见误解点:它只对已启用调试的子进程生效,不是魔法监听所有 fork()。
- 主进程用
node --inspect-brk=9229 app.js启动后,VSCode 才能 attach;子进程必须自己带--inspect-brk=9230参数,例如:fork('./worker.js', [], { execArgv: ['--inspect-brk=9230'] }) -
autoAttachChildProcesses: true只在"request": "launch"配置下起作用,"request": "attach"时完全被忽略 - 全局 Auto Attach(
Debug: Toggle Auto Attach)依赖transport: "inspector"和filter: "smart",若子进程不在当前工作区路径下启动,不会被捕捉 - 用
NODE_OPTIONS='--inspect=0.0.0.0:9229'注入环境变量,可绕过代码修改,但要注意端口冲突和网络绑定(0.0.0.0允许外部连接,有安全风险)
Attach 模式最常被忽略的两个硬性前提
无论哪种语言,以下两点不满足,其他配置全白搭:
- 目标进程必须处于“可调试就绪”状态:Python 要
debugpy已监听、Node.js 要--inspect已启动、C++ 要带-g编译且未 strip —— VSCode 不负责启动调试服务,只负责连接 - VSCode 必须加载了正确的 workspace:launch.json 放在
.vscode/下才生效;用code .打开目录,而不是双击文件或用code file.py单文件模式启动,否则找不到配置











