akiselev/debugger-cli

GitHub: akiselev/debugger-cli

一款面向 LLM 编程智能体的命令行调试器,通过后台 daemon 保持持久调试会话并输出结构化数据,使 AI 智能体能够程序化地运行、控制和检查多语言二进制程序。

Stars: 21 | Forks: 5

# debugger-cli **专为 LLM 编程智能体构建的命令行调试器** [![Crates.io](https://img.shields.io/crates/v/debugger-cli.svg)](https://crates.io/crates/debugger-cli) [![License: GPL-3.0](https://img.shields.io/badge/License-GPL--3.0-blue.svg)](LICENSE) [![Rust](https://img.shields.io/badge/rust-1.70%2B-orange.svg)](https://www.rust-lang.org/) `debugger-cli` 是一款跨平台的调试工具,它使 LLM 编程智能体(以及人类!)能够使用 [Debug Adapter Protocol (DAP)](https://microsoft.github.io/debug-adapter-protocol/) 来调试可执行程序。它提供了一个简单、可脚本化的 CLI 接口,能够在多次命令调用之间保持持久的调试会话。 ## 为什么需要它 LLM 智能体需要交互式地调试程序,但 CLI 命令是短暂的。传统的调试器需要一个交互式会话,这与智能体的工作流不兼容。此工具通过以下方式解决了这个问题: - **维护持久会话**:一个后台 daemon 在命令之间保持调试会话处于活动状态 - **缓冲事件**:即使没有连接客户端,输出、断点命中和停止事件也会被捕获 - **提供统一接口**:适用于任何 DAP 适配器(lldb-dap、CodeLLDB、debugpy、Delve 等) - **对 LLM 友好**:清晰、易于解析的输出,专为智能体读取而优化 ## 功能 - **多语言支持**:调试 C、C++、Rust、Python、Go 等 - **零设置门槛**:`debugger setup lldb` 会自动安装您所需的一切 - **完整的断点控制**:支持行号、函数和条件断点 - **丰富的检查功能**:查看变量、表达式、堆栈跟踪和源代码上下文 - **线程管理**:列出、切换和浏览线程与堆栈帧 - **结构化输出**:对智能体友好的 JSON 格式 - **跨平台**:支持 Linux、macOS 和 Windows ## 快速开始 ### 安装 ``` # 从 crates.io 安装 cargo install debugger-cli # 安装 debug adapter(例如,用于 C/C++/Rust 的 lldb) debugger setup lldb ``` 或者从源码构建: ``` git clone https://github.com/akiselev/debugger-cli.git cd debugger-cli cargo install --path . ``` ### 前置条件 您需要一个兼容 DAP 的调试适配器。最简单的方法是: ``` # 列出可用的调试器 debugger setup --list # 为你的语言安装 debugger setup lldb # C, C++, Rust, Swift debugger setup python # Python (debugpy) debugger setup go # Go (Delve) debugger setup gdb # C, C++ (requires GDB 14.1+) debugger setup cuda-gdb # CUDA (Linux only) ``` 或者手动安装: - **Arch Linux**: `sudo pacman -S lldb` - **Ubuntu/Debian**: `sudo apt install lldb` - **macOS**: `xcode-select --install`(包含 lldb) ### 基本用法 ``` # 开始调试程序 debugger start ./myprogram # 设置 breakpoint debugger break main.c:42 # 或 debugger breakpoint add my_function # 运行至 breakpoint debugger continue # 等待程序停止 debugger await # 检查当前状态 debugger context # Source code + variables debugger locals # Local variables debugger backtrace # Stack trace debugger print myvar # Evaluate expression # 单步执行代码 debugger next # Step over debugger step # Step into debugger finish # Step out # 清理 debugger stop ``` ## 命令参考 ### 会话管理 | 命令 | 别名 | 描述 | |---------|---------|-------------| | `start [-- args]` | | 开始调试某个程序 | | `attach ` | | 附加到正在运行的进程 | | `stop` | | 停止调试会话并终止被调试程序 | | `detach` | | 与进程分离(保持其继续运行) | | `status` | | 显示 daemon 和会话状态 | | `restart` | | 在当前活动的 DAP 适配器支持时重启程序 | 启动选项: - `--adapter ` - 使用指定的调试适配器 - `--stop-on-entry` - 在程序入口点处停止 - `--break ` / `-b` - 在程序启动前设置初始断点 ### 断点 | 命令 | 别名 | 描述 | |---------|---------|-------------| | `breakpoint add ` | `break`, `b` | 添加断点(文件:行号 或 函数) | | `breakpoint remove ` | | 通过 ID 移除断点 | | `breakpoint remove --all` | | 移除所有断点 | | `breakpoint list` | | 列出所有断点 | | `breakpoint enable ` | | 启用已禁用的断点 | | `breakpoint disable ` | | 禁用断点而不移除它 | 断点选项: - `--condition ` - 仅当表达式为真时中断 - `--hit-count ` - 命中 N 次后中断 ### 执行控制 | 命令 | 别名 | 描述 | |---------|---------|-------------| | `continue` | `c` | 恢复执行 | | `next` | `n` | 单步跳过(执行当前行) | | `step` | `s` | 单步进入(进入函数调用) | | `finish` | `out` | 单步跳出(运行直到函数返回) | | `pause` | | 暂停执行 | | `await` | | 等待下一个停止事件 | ### 检查 | 命令 | 别名 | 描述 | |---------|---------|-------------| | `context` | `where` | 显示当前位置的源代码 + 变量 | | `locals` | | 显示局部变量 | | `backtrace` | `bt` | 显示堆栈跟踪 | | `print ` | `p` | 计算表达式 | | `eval ` | | 带副作用地计算表达式 | | `threads` | | 列出所有线程 | ### 导航 | 命令 | 描述 | |---------|-------------| | `thread ` | 切换到某个线程 | | `frame ` | 导航到某个堆栈帧 | | `up` | 在堆栈中向上移动(前往调用者) | | `down` | 在堆栈中向下移动 | ### 程序输出 | 命令 | 描述 | |---------|-------------| | `output` | 获取程序的 stdout/stderr | | `output --follow` | 持续流式传输输出 | | `output --tail ` | 获取最后 N 行 | | `output --clear` | 打印并清除缓冲的输出 | ### 设置 | 命令 | 描述 | |---------|-------------| | `setup ` | 安装调试适配器 | | `setup --list` | 列出可用的调试器 | | `setup --check` | 检查已安装的调试器 | | `setup --auto` | 为检测到的项目自动安装 | ## 架构 ``` ┌─────────────────┐ IPC Socket ┌─────────────────┐ stdio (DAP) ┌─────────────────┐ │ CLI Mode │◄──────────────────►│ Daemon Mode │◄──────────────────►│ DAP Adapter │ │ (user facing) │ │ (background) │ │ (lldb-dap) │ └─────────────────┘ └─────────────────┘ └─────────────────┘ ``` 该工具以**单一二进制的两种模式**运行: 1. **CLI 模式**(瘦客户端):解析命令,通过 IPC 连接到 daemon,显示结果 2. **Daemon 模式**(后台):管理调试会话,与 DAP 适配器通信,缓冲事件 这种架构允许: - 在多次 CLI 调用之间保持持久的调试会话 - 在没有连接客户端时缓冲事件 - 非阻塞的命令执行 - 干净的进程生命周期管理 ## 配置 配置存储在 `~/.config/debugger-cli/config.toml` 中: ``` # 默认 debug adapter adapter = "lldb-dap" # 请求超时时间(秒) timeout = 30 # 自定义 adapter 路径 [adapters] lldb-dap = "/usr/bin/lldb-dap" codelldb = "~/.local/share/debugger-cli/adapters/codelldb/adapter/codelldb" ``` ## 支持的调试适配器 | 适配器 | 语言 | 状态 | |---------|-----------|--------| | lldb-dap | C, C++, Rust, Swift | ✅ 完全支持 | | debugpy | Python | ✅ 完全支持 | | Delve | Go | ✅ 完全支持 | | GDB | C, C++ | ✅ 完全支持(需要 GDB 14.1+) | | CUDA-GDB | CUDA, C, C++ | ✅ 完全支持(仅限 Linux) | | js-debug | JavaScript, TypeScript | ✅ 完全支持 | | CodeLLDB | C, C++, Rust | ✅ 完全支持 | | cpptools | C, C++ | 🚧 计划中 | ## 示例 ### 调试 Rust 程序 ``` # 以 debug info 构建 cargo build # 使用初始 breakpoint 开始调试 debugger start ./target/debug/myprogram --break main # 运行至 breakpoint debugger continue debugger await # 检查状态 debugger context # Thread 1 停止于 src/main.rs:15 # # 13 | let config = Config::load()?; # 14 | let processor = Processor::new(config); # -> 15 | processor.run()?; # # Locals: # config: Config { max_threads: 4, timeout: 30 } # 评估表达式 debugger print config.max_threads # 4 # 单步执行代码 debugger step debugger await # 清理 debugger stop ``` ### 调试 Go 程序 ``` # 以 debug info 构建 go build -gcflags="all=-N -l" -o myprogram # 开始调试 debugger start ./myprogram --adapter go --break main.main # 继续至 breakpoint debugger continue debugger await # 检查 goroutines debugger threads # 查看 locals debugger locals # 清理 debugger stop ``` ### 调试 CUDA 代码 (Linux) ``` # 以 debug info 编译 nvcc -g -G -o cuda_program kernel.cu # 开始调试(使用 cuda-gdb) debugger start ./cuda_program --adapter cuda-gdb --break main # 设置 kernel breakpoint debugger break vectorAdd # 运行至 kernel debugger continue debugger await # 查看 CUDA threads debugger threads debugger stop ``` ## 开发 请参阅 [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) 获取开发者指南,内容包括: - 深入解析架构 - 添加新命令 - 使用 DAP 客户端 - 测试和调试技巧 ## 许可证 本项目基于 GNU General Public License v3.0 授权 - 有关详细信息,请参阅 [LICENSE](LICENSE) 文件。 ## 贡献 欢迎贡献!请随时提交 issue 和 pull request。 1. Fork 该仓库 2. 创建一个功能分支 (`git checkout -b feature/amazing-feature`) 3. 提交您的更改 (`git commit -m 'Add amazing feature'`) 4. 推送到该分支 (`git push origin feature/amazing-feature`) 5. 发起一个 Pull Request
标签:Debug Adapter Protocol, LLM集成, Rust, SOC Prime, 可视化界面, 开发工具, 网络流量审计, 通知系统