1 个不稳定版本
0.1.0 | 2023 年 12 月 13 日 |
---|
#28 在 #rpm
2.5MB
432 行
debuginfod-rs
一个极快的 debuginfod 服务器,用 Rust 编写。
[2023-12-13T08:35:11.001Z INFO debuginfod_rs] walking 173017 RPM files (477.8 GB)
[2023-12-13T08:35:12.389Z INFO debuginfod_rs] parsing took: 2.09 s (228.8 GB/s)
- ⚡️ 比elfutils的debuginfod快30倍(只解析RPM元数据)
- 🧵 多线程解析器和Web服务器
- 🦋 内存数据库(每1TB索引的RPM文件约为200MiB)
- 📦 仅支持基于RPM(支持openSUSE和Fedora/RHEL软件包)
- 🌐 支持完整的debuginfod Web API
- 🗜 支持常用的压缩格式(bzip2,gzip,xz,zstd)
实现细节
索引器受益于由 rpmbuild
创建的符号链接,这些链接将每个ELF可执行文件(和共享库)及其相应的build-id路径链接起来。每个Web请求首先识别一个带有build-id的RPM文件,然后按需提取相应的ELF(或源)文件。对foo-debuginfo
、foo-debugsource
和foo
软件包的分组基于源RPM文件(存在于RPM文件元数据中)。
索引速度高度依赖于磁盘速度,在现代AMD CPU上,可以高达~100 GB/s(对于缓存IO)。
已知限制
- 缺少对RPM容器访问者的
AsyncRead
支持(内容在Web响应中读取到内存中) - 索引器没有实现elfutils对头文件请求的启发式方法,其中文件是build-id的一部分,但实际上存在于不同的RPM软件包中(例如,库的开发子软件包的头文件)
- 缺少磁盘缓存
- 缺少对其他容器如
.deb
的支持
示例用法
.
依赖关系
~27–59MB
~1M SLoC