Rust in Everything
基于 probe-rs 0.32.0

probe-rs 解决什么问题

主线位置:三条主线之外的总览。本页讲 probe-rs 要做的事、做到了多大规模、和同类工具怎么分工;三条主线从下一页开始。

flowchart TB
  user["开发者"] --> cli["probe-rs run / download / attach"]
  user --> vscode["VS Code 等:DAP 协议"]
  user --> gdb["GDB / lldb:RSP 协议"]
  user --> lib["自己的 Rust 程序"]
  cli --> core["probe-rs 库"]
  vscode --> dapsrv["probe-rs dap-server"] --> core
  gdb --> gdbsrv["probe-rs gdb"] --> core
  lib --> core
  core --> probes["USB 探针:CMSIS-DAP、ST-Link、J-Link 等"]
  probes --> chips["芯片:ARM、RISC-V、Xtensa"]

一个工具代替一套组合

调试一块微控制器,主机上要做三件事:把固件写进芯片的 flash;让程序跑起来并看到它的输出;在出问题时让核停下,看寄存器、内存和调用栈。传统上这三件事分给不同的程序:厂商的烧录工具管第一件;一个「调试服务器」(OpenOCD、pyOCD,或 SEGGER 的 J-Link GDB Server)开一个 TCP 端口,讲 GDB 的远程串行协议,GDB 连上去管第三件;输出要么走串口,要么走 semihosting 或 SEGGER 的 RTT。

probe-rs 把这些放进同一个 Rust 库,再在库上面做了几种前端。README 列的能力:

  • Connect to a DAPLink, STLink, JLink, FTDI probes, ESP32 devices with USB JTAG, WLink and the Blackmagic probe.
  • Talk to ARM, Risc-V and Xtensa cores via SWD or JTAG.
  • Read and write arbitrary memory of the target.
  • Halt, run, step and step any core, operate breakpoints, enable trace functionality and much more.
  • Download ELF, BIN and IHEX binaries using standard CMSIS-Pack flash algorithms.
  • Debug a target via the CLI, VSCode (MS-DAP) and GDB.

对 Rust 嵌入式开发者来说,最直接的好处在 README 的「Which tool should I use?」一节:在 .cargo/config.toml 里写一行

[target.'cfg(all(target_arch = "arm", target_os = "none"))']
runner = "probe-rs run --chip nRF52840_xxAA"

cargo run 就会编译、烧录、复位,然后把 RTT / defmt 日志和 panic 打在终端上。同一个工具链里还有 cargo-flash(只烧录)和 cargo-embed(带一个交互式 RTT 终端;README 说它「expected to be phased out in the future」)。

规模

维度0.32.0 的情况本卷在哪讲
探针核心库内置 9 个驱动:Black Magic Probe、CMSIS-DAP(v1 HID 与 v2 bulk)、FTDI、ST-Link、J-Link、WCH-Link、SiFli UART、Glasgow、CH347;ESP 插件加一个 ESP 内置 USB-JTAG,Linux 插件加 GPIO 和 spidev 两种直连DebugProbe 与驱动注册表
架构ARM:Armv6-M、Armv7-M、Armv8-M,以及 Armv7-A/R、Armv8-A;RISC-V:RV32,0.32 起支持 RV64 和 Debug Spec 1.0;Xtensa03 ARM 调试架构、04 RISC-V 与 Xtensa
芯片probe-rs/targets/ 下 242 个目标描述文件;本机 probe-rs chip list 列出 260 个家族、4391 个型号,其中 12 个家族来自 ESP 插件目标描述
前端probe-rs 命令行的 20 多个子命令、cargo-flash、cargo-embed、DAP 服务器、gdb 服务器09 调试服务器
代码核心库 src/ 8.1 万行,命令行 3.2 万行,调试信息 1.2 万行源码地图

芯片数量来自本机实测:

$ probe-rs chip info STM32F103C8
STM32F103C8
Cores (1):
    - main (Armv7m)
NVM: 0x08000000..0x08010000 (64.0 KiB)
RAM: 0x20000000..0x20005000 (20.0 KiB)
NVM: 0x1ffff800..0x1ffff810 (16 B)

chip list 的输出是「家族名、Variants:、每行一个型号」,按行数数出来的。目标描述里大部分 flash 算法是从厂商发布的 CMSIS-Pack 里转出来的(工具是工作区里的 target-gen),所以 probe-rs 不用为每颗芯片手写烧录代码,target-gen 与 CMSIS-Pack、flash 算法两章讲。

和同类工具的位置

下表只写各工具公认、各自文档能查到的基本事实,不比性能(本卷没有测):

probe-rsOpenOCDpyOCDSEGGER J-Link 软件
实现语言RustCPython闭源
形态库 + 命令行 + DAP 服务器 + gdb 服务器一个守护进程,开 GDB、telnet、Tcl 端口库 + 命令行 + gdb 服务器J-Link Commander、J-Link GDB Server、J-Flash 等一组程序
怎么描述目标YAML 目标描述,编译进二进制;flash 算法多来自 CMSIS-PackTcl 配置脚本(interface 脚本 + target 脚本)内置目标,也能直接读 CMSIS-Pack内置设备库
探针多家,见上表支持的适配器种类很多CMSIS-DAP、ST-Link、J-Link 等只支持 J-Link
编辑器调试自带 DAP 服务器(VS Code 扩展)通过 GDB通过 GDB通过 GDB

两点需要说明:

  • RTT 最初是 SEGGER 的技术,控制块的符号名就叫 _SEGGER_RTT。probe-rs 自己实现了主机这一侧:通过调试端口读写目标 RAM 里的环形缓冲区,不依赖 SEGGER 的软件,RTT 控制块与通道一章讲。
  • GDB 在 probe-rs 里只是前端之一。probe-rs gdb 用 gdbstub 实现了一个服务器,只支持硬件断点;完整的调试体验放在 DAP 一侧,gdb server和 DAP server两章讲。反过来,probe-rs 里没有 GDB 远程协议的客户端,所以它不能去连 QEMU 的 gdbstub:这也是 embassy 卷的 QEMU 实验和本卷之间没有现成桥梁的原因。

0.30 到 0.32 的主要变化

最近三个版本:0.30.0(2025-10-31)、0.31.0(2026-01-17)、0.32.0(2026-07-22)。和本卷关系最大的变化(括号里是 CHANGELOG 里的 PR 号):

版本变化影响本卷哪里
0.30ArmCommunicationInterface 去掉 typestate(#3382),ArmProbeInterface 改名 ArmDebugInterface(#3425)DP、AP 与 SELECT
0.30CMSIS-DAP v1 放到 cmsisdap_v1 feature 后面(#3473);去掉 CMSIS-DAP 传输出错时的自动重试(#3466)CMSIS-DAP 驱动
0.30新增 Glasgow 探针(只支持 SWD,#3388);embedded-test 的用例直接从 ELF 读(#3512)02 部分、10 部分
0.31flash 算法新增 rtt_poll_interval,默认 20 ms(#3713)flash 算法
0.32ESP 支持搬进 probe-rs-espressif(#3813);register_vendor 换成插件入口 register_plugin(#3834);新增 probe-rs-linux 插件(#3986)源码地图
0.32RISC-V Debug Spec 1.0(#4039)、RV64(#3910)RISC-V 调试模块
0.32DAP 服务器支持 stdin / stdout 传输(#3926);probe-rs run / attach 可以往 RTT down channel 写数据(#3746)RTT 控制块与通道、DAP server
0.32probe-rs debug 改成位置参数接固件、新增 -c 执行命令(#3852、#4110);gdbstub 降回 0.7.8(#4021)gdb server
0.32CMSIS-DAP 块传输里的 FAULT 按单次传输的方式处理(#3806);读请求没拿到数据时返回错误而不是 panic(#4130)CMSIS-DAP 驱动
0.32复位后硬件断点被静默忽略的问题(#3810);单步时保留状态以区分停下的原因(#4040)Cortex-M 内核

0.x 的每个次版本都可能有破坏性改动,上面好几条(插件入口、typestate、AP 寄存器改成 bitfield 访问器 #4125)都改了公开 API,所以本卷只对 0.32.0 负责。

小结

  • probe-rs 是一个库加若干前端:命令行(run 可以直接当 cargo runner)、DAP 服务器、gdb 服务器;目标是用一个工具代替「烧录器 + 调试服务器 + GDB」的组合。
  • 0.32.0 内置 9 个探针驱动,插件再加 3 个;支持 ARM Cortex-M / A / R、RISC-V(含 RV64)和 Xtensa;本机实测 260 个芯片家族、4391 个型号。
  • 和 OpenOCD、pyOCD、SEGGER 工具相比,probe-rs 的不同在于库的形态和自带的 DAP 服务器;它只有 GDB 协议的服务端,没有客户端,不能连 QEMU。
  • 0.30 去掉了 ARM 接口的 typestate,0.32 引入插件、把 ESP 拆出去、加了 RISC-V Debug Spec 1.0 与 RV64、DAP stdio 和 RTT 下行写入。

💬 关联讨论

发起讨论
加载中...