14 个版本
0.2.0-rc.0 | 2024 年 6 月 10 日 |
---|---|
0.2.0-alpha.11 | 2024 年 2 月 23 日 |
0.2.0-alpha.9 | 2023 年 12 月 11 日 |
0.2.0-alpha.8 | 2023 年 11 月 2 日 |
0.1.0 |
|
#34 in 调试
370 每月下载量
用于 7 个 Crates (5 直接)
635KB
14K SLoC
blazesym
blazesym 是一个可用于符号化地址的库。地址符号化是在跟踪上下文中常见的问题,例如,用户希望通过名称推理函数,但低级组件只报告“原始”地址(例如,堆栈跟踪的形式)。
除了符号化之外,blazesym 还提供了反向操作的 API:从符号名称查找地址。这对于配置断点或跟踪点可能很有用。
该库旨在提供“一站式”体验。也就是说,它试图默认执行预期的事情。当这种便利性以性能为代价时,我们旨在提供高级 API,允许在运行时配置相应的功能。
blazesym 支持多种格式,如 DWARF、ELF、Breakpad 和 Gsym(以下为最新列表)。
这个库是用Rust编写的,并提供了一流的C API。此crate遵循Cargo的语义版本控制规则。至少,它使用最近的Rust稳定版减去五个小版本("N - 5")进行构建。例如,假设最近的Rust稳定版是1.68
,则crate保证能够与1.63
和更高版本兼容。
状态
blazesym是Meta内部持续分析解决方案的核心,每天处理数十亿个符号化请求。
该库正在积极开发中,主要目标是稳定API界面。欢迎就讨论、功能建议或代码贡献做出贡献!
如上所述,该库支持多种格式。对于符号化而言,以下表格说明了每种格式支持的功能以及blazesym目前是否可以使用此功能
格式 | 功能 | 格式支持吗? | blazesym支持吗? |
---|---|---|---|
Breakpad | 符号大小 | ✔️ | ✔️ |
源代码位置信息 | ✔️ | ✔️ | |
内联函数信息 | ✔️ | ✔️ | |
ELF | 符号大小 | ✔️ | ✔️ |
源代码位置信息 | ✖️ | ✖️ | |
内联函数信息 | ✖️ | ✖️ | |
DWARF | 符号大小 | ✔️ | ✔️ |
源代码位置信息 | ✔️ | ✔️ | |
内联函数信息 | ✔️ | ✔️ | |
Gsym | 符号大小 | ✔️ | ✔️ |
源代码位置信息 | ✔️ | ✔️ | |
内联函数信息 | ✔️ | ✔️ | |
Ksym | 符号大小 | ✖️ | ✖️ |
源代码位置信息 | ✖️ | ✖️ | |
内联函数信息 | ✖️ | ✖️ |
以下是当前计划功能的粗略路线图(不分先后顺序)
- 完全支持内核地址的处理
- 目前规范化API仅支持用户空间地址
- 切换到使用
gimli
进行DWARF解析- 这样做将使我们能够
- 支持更多版本的DWARF标准(https://github.com/libbpf/blazesym/issues/42 & https://github.com/libbpf/blazesym/issues/57)
- 支持分割调试信息(https://github.com/libbpf/blazesym/issues/60)
- 支持DWARF的内联函数查找(https://github.com/libbpf/blazesym/issues/192)
- 这样做将使我们能够
- 支持APK中的地址符号化(对Android相关)(《https://github.com/libbpf/blazesym/pull/222》 & 《https://github.com/libbpf/blazesym/pull/227》)
- 支持ELF32二进制文件(https://github.com/libbpf/blazesym/issues/53)
- 支持处理压缩的调试信息(《https://github.com/libbpf/blazesym/issues/581》)
- 支持Rust & C++符号名的去混淆(《https://github.com/libbpf/blazesym/issues/50》)
- 支持远程符号化(《https://github.com/libbpf/blazesym/issues/61》)
- 添加地址规范化API(《https://github.com/libbpf/blazesym/pull/114》,《https://github.com/libbpf/blazesym/pull/128》等)
- 支持涉及
debuginfod
的高级符号化用例(《https://github.com/libbpf/blazesym/issues/203》)
操作系统支持
该库的主要目标操作系统是Linux(它应在所有较新的内核版本和发行版上工作)。目前对MacOS没有积极支持(尽管可能工作),但我们将很高兴接受任何修复潜在缺陷的pull请求。
构建与使用
blazesym 需要标准的 Rust 工具链,可以使用 Cargo 项目管理器进行构建(例如,cargo build
)。
Rust
从 Rust 项目中消费应通过 Cargo.toml
[dependencies]
blazesym = "=0.2.0-rc.0"
请参考 examples/
文件夹 中的快速示例。有关单个类型和函数的综合说明,请参阅 文档。
C
配套的 crate blazesym-c
提供了从 C 与库交互的方法。请参阅其 README
了解使用详情。
命令行
该库还附带了一个 命令行界面,用于快速实验和调试。您可以直接从仓库运行它,例如。
cargo run -p blazecli -- symbolize elf --path /lib64/libc.so.6 00000000000caee1
请参阅其 README
以及帮助文本以获取更多信息和使用说明。
各种目标三联体的静态链接二进制文件可根据需要在此 处 获取。
依赖项
~0–3MB
~44K SLoC