axbacktrace 技术文档
路径:
components/axbacktrace类型:库 crate 分层:组件层 / 调试与回溯基础件 版本:0.1.2文档依据:Cargo.toml、src/lib.rs、src/dwarf.rs
axbacktrace 为 ArceOS 体系提供栈回溯能力。它负责从当前上下文或 trap 上下文收集栈帧,并在启用 dwarf 时利用调试段做符号化输出。它属于调试叶子基础件:既不是 panic 处理器,也不是异常分发框架,更不是通用 DWARF 装载服务。
1. 架构设计分析
1.1 设计定位
axbacktrace 的职责非常聚焦:
- 向下,它依赖架构相关的帧指针读取和可选的 DWARF 调试段。
- 向上,它向
ax-runtime的 panic 路径、ax-alloc的 tracking 路径、ax-cpu的 trap context 提供统一的Backtrace对象。 - 横向,它把“捕获栈帧”和“解析符号”拆成两个层次:不开
dwarf仍可存在Backtrace,但会退化为不可解析或禁用状态。
所以 axbacktrace 解决的是“如何得到并展示回溯”,而不是“何时触发 panic”“如何恢复异常”。
1.2 模块划分
src/lib.rs:回溯入口、栈展开逻辑、Backtrace状态机与架构相关帧指针读取。src/dwarf.rs:dwarffeature 下的符号化支持,负责从链接器暴露的.debug_*段初始化addr2line::Context。
1.3 关键对象
Frame:一帧的原始表示,包含fp与ip。Backtrace:对外暴露的回溯对象。Inner:Backtrace内部状态,区分Unsupported、Disabled与Captured(Vec<Frame>)。FrameIter:只在dwarf下可用的符号化帧迭代器。IP_RANGE/FP_RANGE:初始化后保存合法代码区和合法帧指针区间。MAX_DEPTH:限 制展开深度,默认32。
1.4 栈展开主线
常规捕获路径如下:
源码里有几个重要细节:
Frame::OFFSET会因架构不同而变化,x86_64/aarch64为0,其他架构为1。unwind_stack()必须先看到FP_RANGE,否则不会 panic,而是记日志并返回空向量。- 为避免坏栈或损坏的帧指针无限追链,代码同时检查最大深度和“单步跳跃是否超过 8 MiB”。
1.5 trap 回溯与 DWARF 解析
capture_trap(fp, ip, ra):给 trap/异常上下文使用。ax-cpu在x86_64、aarch64、riscv、loongarch64的 trap context 中都直接调用它。dwarf::init():通过__start_debug_*/__stop_debug_*链接符号抓取 DWARF 段,并建立addr2line::Context。frames():只在dwarf打开时可用,返回的是“原始帧 + 解析后符号帧”的组合迭代器。
如果不开 dwarf,Backtrace::capture() 仍然可以返回 Backtrace,但其内部状态会是 Disabled,不会进行符号化。