Rust in Everything
基于 probe-rs-tools 0.32.0

调试服务器

前面各部分讲的都是库:探针、架构、Session、烧录、RTT、DWARF。这一部分讲 probe-rs-tools 怎么把库交给别的程序用。三章:

  1. DAP server 与 VS Code:调试主线的终点。TCP 与 stdio 两种传输;请求循环在核运行时每 50 ms 轮询一次;dispatch_request 的 21 个分支各落到哪个调用;每次停下(包括每次单步)都全量展开最多 500 帧;SVD 外设视图怎么避开有读副作用的寄存器。
  2. gdb server:gdbstub 上的一层薄壳:按核类型分组开端口,非阻塞地驱动 gdbstub 状态机;只支持硬件断点,没有软件断点和 watchpoint;用 lldb 的包日志看 qSupported、target.xml、内存映射和 Z0 / Z1 / Z2;gdbstub 为什么精确钉在 0.7.8。
  3. CLI 的 RPC 架构:命令主线的骨架。postcard-rpc 的 31 个 endpoint 和 5 个 topic;Session 留在服务端的对象仓库里;哪些子命令走 RPC、哪些直接调库;remote feature 下 websocket 与 unix socket 的接入和认证。
flowchart TB
  vscode["VS Code"] -->|"DAP:JSON"| dap["dap-server"]
  gdbc["GDB / lldb"] -->|"RSP"| gdbs["gdb"]
  cli["run / download / info 等"] --> rpc["本地 RPC 服务端"]
  remote["远程客户端"] -.->|"websocket / unix socket"| serve["serve:remote feature"]
  serve -.-> rpc
  dap --> lib["probe-rs 库:Session、Core"]
  gdbs --> lib
  rpc --> lib
  dap --> dbg["probe-rs-debug:展开、变量、单步"]

三者的对照:

DAP servergdb serverRPC 命令
建 Session自己建simple_attach服务端 probe/attach
--dry-run无此参数有效(FakeProbe)无效(probe/select 先失败)
栈展开、变量服务端用 probe-rs-debugGDB 自己做run 停在异常时打印调用栈
RTT / semihosting处理不处理处理,defmt 在客户端解码
多核只调一个核同类型的核作为线程按 --core

本部分的实验只有 gdb server 一处:用本机 probe-rs gdb --dry-run 起服务端、lldb 抓包。DAP server 和远程 RPC 只读源码:前者需要一个 DAP 客户端驱动完整的启动序列,后者需要开了 remote feature 的构建。需要真硬件的数字(DAP 每次停下的读量和耗时、远程模式的延迟)标「待实测」。

💬 关联讨论

发起讨论
加载中...