调试服务器
前面各部分讲的都是库:探针、架构、Session、烧录、RTT、DWARF。这一部分讲 probe-rs-tools 怎么把库交给别的程序用。三章:
- DAP server 与 VS Code:调试主线的终点。TCP 与 stdio 两种传输;请求循环在核运行时每 50 ms 轮询一次;
dispatch_request的 21 个分支各落到哪个调用;每次停下(包括每次单步)都全量展开最多 500 帧;SVD 外设视图怎么避开有读副作用的寄存器。 - gdb server:gdbstub 上的一层薄壳:按核类型分组开端口,非阻塞地驱动 gdbstub 状态机;只支持硬件断点,没有软件断点和 watchpoint;用 lldb 的包日志看
qSupported、target.xml、内存映射和Z0/Z1/Z2;gdbstub 为什么精确钉在 0.7.8。 - CLI 的 RPC 架构:命令主线的骨架。postcard-rpc 的 31 个 endpoint 和 5 个 topic;
Session留在服务端的对象仓库里;哪些子命令走 RPC、哪些直接调库;remotefeature 下 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 server | gdb server | RPC 命令 | |
|---|---|---|---|
建 Session | 自己建 | simple_attach | 服务端 probe/attach |
--dry-run | 无此参数 | 有效(FakeProbe) | 无效(probe/select 先失败) |
| 栈展开、变量 | 服务端用 probe-rs-debug | GDB 自己做 | run 停在异常时打印调用栈 |
| RTT / semihosting | 处理 | 不处理 | 处理,defmt 在客户端解码 |
| 多核 | 只调一个核 | 同类型的核作为线程 | 按 --core |
本部分的实验只有 gdb server 一处:用本机 probe-rs gdb --dry-run 起服务端、lldb 抓包。DAP server 和远程 RPC 只读源码:前者需要一个 DAP 客户端驱动完整的启动序列,后者需要开了 remote feature 的构建。需要真硬件的数字(DAP 每次停下的读量和耗时、远程模式的延迟)标「待实测」。
💬 关联讨论
发起讨论加载中...