Extension Debug @piex-dev/dap

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。

lifecycle
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。

使用说明

安装

bash
pi install npm:@piex-dev/dap

仓库源码:extensions/dap

前提条件

扩展负责协议与会话,不负责替你装调试器。对应语言还要装 adapter 本体:

bash
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 tool
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")

验证

bash
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.tsdefaults.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.12026-07-19初始版本:14 个 adapter 默认配置;DAP 客户端(stdio + JSON-RPC);会话管理(断点队列、输出环形缓冲、空闲回收、超时夹紧);Node.js 移植(Bun.spawn → child_process.spawn)