设备现场复位后,最有价值的信息通常已经消失了。崩溃转储的作用是在异常或看门狗复位时保住一份足够小、却能还原问题的现场:复位原因、寄存器、少量栈、任务身份、固件版本和最近事件。下一次正常启动后再上传或符号化,而不是指望故障时串口一定还能工作。

异常/看门狗触发冻结最小现场写入带 CRC 的转储槽系统复位启动后读取、上传并符号化
转储内容优先保存能回答“哪版固件、在哪个线程、为什么复位”的字段。
复位来源区分看门狗、低压、软件复位和异常路径。寄存器帧保存 PC、LR、SP 和故障状态,供地址还原。任务信息记录线程名、优先级或当前状态,缩小并发问题范围。栈片段长度固定,避免一次故障转储占满存储。固件标识哈希、版本和构建号必须能找到对应符号文件。CRC 与提交位启动时只解析完整写入的转储,防止误报。

故障路径只能做确定的事

异常处理器不应等待互斥锁、申请内存、格式化长字符串或访问复杂驱动。这些组件可能正是故障的一部分。预先分配一个固定大小的保留 RAM 区或 Flash 槽,把固定字段按二进制写入、计算校验并提交即可;复杂的 JSON、网络上传和符号解析放到下次启动后的普通任务里。

如果需要写 Flash,要考虑擦除时间和掉电窗口。保留 RAM 可以在快速复位后保存现场,Flash 更适合跨断电保存。两者也可配合:故障时先写 RAM,启动后的恢复任务再把有效转储移入持久槽。

把转储当作一份有版本的协议

转储结构会随着固件演进。为它设置 magic、版本、长度和 CRC,并在解析工具中保留旧版本兼容路径。一次转储只有配套的 ELF 和链接地址才有意义,因此产物归档和构建标识是调试链路的一部分,不是发布后的附加工作。

参考:CmBacktrace