DAP远程调试教学方案

2026-09-08 00:00    #todo  

目标:老师(Agent)驱动 gdb 调试,学生(用户)在浏览器里实时观看源码、当前执行行、变量值,达到教学目的。

1. 背景与需求

2. 为什么选 DAP

DAP(Debug Adapter Protocol)是 Microsoft 定义的语言无关的调试协议,把"调试 UI"和"调试器"彻底解耦:

1你的浏览器(前端)   DAP JSON-RPC   DAP 适配器    gdb/lldb
2   (显示源码/当前行/变量)          (cpptools / lldb-dap)   (实际调试)

3. 核心难点:一个适配器一次只服务一个客户端

教学场景要求"老师驱动 + 学生观看",但 DAP 适配器默认是 1:1 的。 因此正确姿势是在中间加一个 DAP 网关(proxy)

1你的浏览器(VS Code 网页版 / 自写页) ⇄ WebSocket ⇄ 网关 ⇄ TCP(DAP) ⇄ lldb-dap --port 4711 ⇄ gdb
23                                             老师命令通道(同一协议)

4. 协议消息示例

 1// 客户端发给适配器:
 2{"type":"request","seq":1,"command":"initialize","arguments":{"adapterID":"lldb"}}
 3{"type":"request","seq":2,"command":"setBreakpoints","arguments":{"source":{"path":"1.cpp"},"breakpoints":[{"line":10}]}}
 4{"type":"request","seq":3,"command":"continue"}
 5
 6// 适配器推给前端:
 7{"type":"event","event":"stopped","body":{"reason":"breakpoint","threadId":1}}
 8
 9// 前端请求变量:
10{"type":"request","command":"stackTrace",...}  {"type":"response","body":{"stackFrames":[...]}}
11{"type":"request","command":"variables",...}   {"type":"response","body":{"variables":[{"name":"m","value":"7"},...]}}

5. 落地三档方案

档位 1:零代码验证 DAP 远程调试(10 分钟)

档位 2:完整教学方案(推荐)

档位 3:自写轻量前端(教学神器)

6. 与 ttyd 方案的对比

维度ttyd + gdb TUIDAP 网关
界面终端 TUI(源码 + 当前行,变量靠 display)网页版 VS Code / Monaco,变量面板完整
老师驱动直接 tmux send-keys 敲 gdb 命令发 DAP JSON 消息,可脚本化(自动 step 20 次)
多人观看一个终端会话,天然共享网关广播,可任意加观众
教学价值学到 gdb 命令学到 DAP 协议本身
工程量低(几乎零)中(网关 200 行 + 前端)

7. 推荐路径

  1. 先做档位 1,验证"DAP 远程调试"手感(装 lldb-dap + debugServer 配置)
  2. 上档位 2,加网关,实现"老师调、学生看"
  3. 教学效果拉满再上档位 3(自写前端)

8. 下一步待办