dap — 让 Coding Agent 真正会调试
导语
装上 @piex-dev/dap 之后,agent 可以像人一样「跑起来看」。它替代不了测试,但会把「猜变量」变成「读变量」。
简介
多数 coding agent 的「修 bug」路径是:读代码猜原因 → 改几行 → 用 bash 再跑测试 → 失败就再猜。一碰到「只有运行时才暴露」的问题就很脆:空指针在哪层调用栈?局部变量当时是什么?断点能不能停在条件分支上?
DAP 是 VS Code 那套调试协议。@piex-dev/dap 把它接到 pi 上:模型调用 debug 工具,就能 launch、下断点、单步、看变量。
技术原理
三层分工:Agent(pi + LLM 决策)→ DAP 客户端(@piex-dev/dap 翻译成标准 DAP 请求)→ Debug Adapter(debugpy/dlv/lldb-dap 真正控制进程)。会话状态机 running/stopped/terminated,模型每次拿到的是会话摘要 + 格式化文本,而非原始 JSON-RPC。
launch/attach → spawn adapter(stdio) → initialize
→ running → stopped(断点/步进/异常)
→ stack_trace/variables/evaluate
→ continue/step_* → terminate
适配器选择:defaults.json 按启动命令、语言后缀、项目根标记、launch/attach 默认参数配置;launch 时按文件后缀 + 工作区根标记自动挑 adapter。Node 移植只做 stdio(本机够用、省 socket 生命周期),不支持远程 TCP attach。
使用说明
安装
pi install npm:@piex-dev/dap
仓库源码:extensions/dap
前提条件
扩展负责协议与会话,不负责替你装调试器。对应语言还要装 adapter 本体:
pip install debugpy # Python
brew install llvm # lldb-dap
go install github.com/go-delve/delve/cmd/dlv@latest # Go
已支持 14 个 adapter:gdb、lldb-dap、codelldb、debugpy、dlv、js-debug-adapter、netcoredbg、kotlin-debug-adapter、rdbg、php-debug-adapter、bash-debug-adapter、dart-debug-adapter、flutter-debug-adapter、elixir-ls-debugger。
配置
默认配置在 extensions/dap/defaults.json。无需手写配置,扩展按文件后缀 + 项目根标记自动选 adapter;模型也可显式指定 adapter 名称。
典型用法
debug(action=launch, program=./main.py)
debug(action=set_breakpoint, path=main.py, line=42)
debug(action=continue)
# 命中后
debug(action=stack_trace)
debug(action=variables, variablesReference=…)
debug(action=evaluate, expression="user.id")
验证
pi -e ./extensions/dap/src/dap.ts -p "what is 1+1" --no-session
实现方案
dap.ts 注册 debug 工具分发 action;client.ts 处理 Content-Length 帧 + JSON-RPC;session.ts 管会话、断点队列、输出缓冲、空闲清理;config.ts 读 defaults.json 选择 adapter。
| 能力域 | action |
|---|---|
| 会话 | launch / attach / terminate / sessions / output |
| 断点 | set_breakpoint / remove_breakpoint |
| 执行 | continue / step_over / step_in / step_out / pause |
| 观察 | stack_trace / threads / scopes / variables / evaluate |
| 底层 | disassemble / read_memory / write_memory / modules / loaded_sources / custom_request |
能力按 adapter 上报的 capabilities 检查:不支持的操作直接报错,避免 silently no-op。工程细节:断点变更串行化、输出环形缓冲(~128KB)、空闲回收、超时夹紧(5s–300s,默认 30s)、非交互环境变量注入(PAGER=cat)。
设计参考
| 项目 | 机制 | piex 取舍 |
|---|---|---|
| oh-my-pi dap | 完整 DAP 客户端:stdio + TCP + WebSocket;14+ adapter;结构化输出;TUI variable explorer | 采纳:14 adapter 配置、JSON-RPC 帧协议、断点队列、输出缓冲上限、空闲回收。不采纳:TCP/WebSocket、TUI overlay(pi API 限制) |
| VS Code DAP | 协议规范三层模型(editor / client / adapter) | 借鉴:三层分工理念、capabilities 检查、stop 后自动附上下文摘要 |
核心取舍:只做 stdio(简单安全),不做远程 attach;先文本输出,暂缓 TUI;capabilities 驱动能力面,不一次铺满。
迭代记录
路线图
| 现状 | 影响 | 打算 |
|---|---|---|
| 仅 stdio,无 TCP/WebSocket | 难远程 attach | 可选 TCP 作高级能力,默认仍 stdio |
| 数据/指令/异常断点未完整暴露 | 「谁改了内存」类问题吃力 | 按 capabilities 逐步挂到工具面 |
| completions、exceptionInfo 未全部暴露 | adapter 已有能力模型用不上 | 按使用频率补 action |
| 纯文本输出 | 栈与变量可读性弱于 omp | 先做 stop 默认摘要包,再考虑 TUI |
| 依赖本机已装 adapter | 新环境门槛高 | 文档说清缺失项;评测镜像预装 |
产品向:停住即给上下文(stop 自动附栈顶 + 关键变量);launch 可项目化(读 .vscode/launch.json);评测挂钩(debug_success 可复现任务量)。
版本记录
| 版本 | 日期 | 变更 |
|---|---|---|
| 0.1.1 | 2026-07-19 | 初始版本:14 个 adapter 默认配置;DAP 客户端(stdio + JSON-RPC);会话管理(断点队列、输出环形缓冲、空闲回收、超时夹紧);Node.js 移植(Bun.spawn → child_process.spawn) |
源稿 Markdown: docs/packages/dap.md