[SOP2.1]配置项目级别的launch.json进行调试
2026/2/12大约 3 分钟
[SOP2.1]配置项目级别的launch.json进行调试
lauch.json中那个port、host、program到底是啥意思啊?这些参数是干啥的
1、VS Code启动1个服务器在你指定的host和指定的端口port启动调试器
2、vscode按照你指定的调试器(比如dlv)编译并运行你的程序
3、VS Code启动1个自己的客户端,然后连接到 你指定的host和指定的端口port 开始调试
4、你在vscode本体的操作,本质是操作vscode的那个客户端去打到他的服务端去
request有3类
在 VS Code 的 launch.json 里,request 常见有 3 种类型:
"request": "launch" | "attach" | "custom"【很少见】
- DAP (Debug Adapter Protocol) 服务器
以go的dlv为例
| 模式 | 端口控制 | 配置要求 | 性能 |
| 手动附加【对应(attach)】 | ✅ 完全控制 | 需要终端启动 | ✅ 最佳 |
| Legacy【对应launch】 | ✅ 固定端口 | 需要设置切换 | ✅ 很好 |
| DAP | ❌ 随机端口 | 不能有 port/host | ⚠️ 一般 |
方案1:手动附加(attach)模式【推荐】
因为
- 端口完全可控(8300)
- 性能最好
- 配置简单明确
- 符合你的端口白名单要求
这样你只需要: - 在终端运行
dlv debug命令 - 在 VS Code 中选择 "Attach to Gin (8300)" 配置
- 开始流畅调试
可以使用的go的attach模型,本地手机打到服务器,服务器调试
{
"name": "附加在本地运行的processID上调试",
"type": "go",
"request": "attach",
"mode": "local",
"processId": 0
}processId 设置为 0 的意思是 让 VS Code 调试器弹出选择框,让你手动选择要 attach 的进程,而不是固定某个 PID。
警告
- vscode的attach调试模式的底层实现原理是什么?
VS Code 的 attach 调试模式 底层其实是靠 Debug Adapter Protocol (DAP) + 语言运行时提供的 调试接口 来实现的。整体流程可以分解成几个层次:
VS Code attach 调试模式的底层实现,就是通过 Debug Adapter,使用对应语言的调试协议(CDP / JDWP / GDB/LLDB / Delve / debugpy…)去连接目标进程。 - VS Code 本身只管 UI 和 DAP,不直接调试进程。
不同语言的 attach 原理
不同语言的 attach,其实只是 Debug Adapter 接到的底层调试接口不同:
- Node.js / 浏览器 JS:基于 Chrome DevTools Protocol (CDP)。
- Java:基于 Java Debug Wire Protocol (JDWP),JVM 在启动时加 -agentlib:jdwp=... 参数开放调试端口。
- Python:VS Code Python 扩展用 debugpy 库,它能在运行时 import debugpy; debugpy.listen(port) 暴露一个调试服务,VS Code 就能 attach。
- C/C++:用 GDB/LLDB,通过 MI (Machine Interface) 协议 attach 到进程。
- Go:依赖 Delve (dlv) 调试器,Delve 提供 gRPC/JSON API,VS Code Go 扩展通过它 attach。
方案2:legacy 模式 + 固定端口
- 切换到 legacy 模式 + 固定端口【成功了】
步骤1,配置.vscode/settings.json
{
"go.delveConfig": {
"debugAdapter": "legacy"
}
}步骤2:使用固定端口配置
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Gin Legacy",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}",
"port": 8300, // 固定在你白名单范围内的端口
"host": "127.0.0.1",
"showLog": true,
"dlvFlags": [
"--check-go-version=false",
"--headless=true",
"--api-version=2",
"--listen=:8300"
]
}
]
}方案3
- 不要再在 DAP 模式下尝试固定端口了,这是不被支持的!
- 如果你非要使用 DAP 模式,必须移除 port 和 host