88 个稳定版本 (7 个主要版本)
12.10.0 | 2024年7月24日 |
---|---|
12.8.0 | 2023年12月1日 |
12.7.1 | 2023年11月29日 |
12.3.0 | 2023年7月19日 |
5.7.1 | 2018年11月28日 |
#198 在 游戏开发
每月下载量:375
在 symbolic 中使用
53KB
997 行代码(不含注释)
Symbolic
Symbolic 是一个用 Rust 编写的库,在 Sentry 中用于实现原生堆栈跟踪符号化、处理压缩 JavaScript 的 source map 以及更多功能。它由多个主要独立的包组成,这些包被打包成一个 C 和 Python 库,以便可以在 Rust 之外独立使用。
包中包含的内容
Symbolic 提供以下功能
- 基于自定义缓存文件的符号化
- 从以下生成符号缓存文件
- Mach、ELF 和 PE 符号表
- Mach、ELF 和 PE 嵌入的 DWARF 数据
- PDB CodeView 调试信息
- .NET 可移植 PDB
- Breakpad 符号文件
- Unity IL2CPP
- Demangling 支持
- C++(GCC、clang 和 MSVC)
- Objective C / Objective C++
- Rust
- Swift
- JavaScript sourcemap 展开
- 基本令牌映射
- 基于压缩源代码找到原始函数名的启发式方法
- 索引 source map 到 source map 合并
- Proguard 函数映射
- 从 Mach、ELF 和 PDB 生成 Breakpad 符号文件
- 方便的 C 和 Python 库
- 处理 Unreal Engine 4 原生崩溃报告
- 提取和处理 minidump
- 公开日志和 UE4 上下文信息
Rust 使用
Rust 包发布到 Crates.io,文档可在 docs.rs 上找到。
Python 使用
Symbolic托管在PyPI上。它作为一个库,包含预构建的适用于Linux和macOS的wheel文件。在其他操作系统上或用作Rust库时,需要手动构建Symbolic。它应与Python 2和Python 3兼容。
Python库将所有上述功能打包在一个平面模块中。
from symbolic import Archive
fat = Archive.open('/path/to/object')
obj = fat.get_object(arch = 'x86_64')
print 'object debug id: {}' % obj.debug_id
C语言绑定
Symbolic还提供C语言绑定,允许FFI(Foreign Function Interface)与任意语言交互。有关更多信息,请参阅Symbolic C-ABI README。
源Crates
该库暴露的许多功能来自独立的Rust crates,以实现更好的使用。
构建和开发
要构建Rust crate,我们需要最新的稳定版Rust以及一个C++11编译器。该crate被分割成一个包含多个功能的workspace,因此构建或运行测试时,请确保传递--all
和--all-features
标志。
# Check whether the crate compiles
cargo check --all --all-features
# Run Rust tests
cargo test --all --all-features
我们使用最新稳定通道的rustfmt
和clippy
进行代码格式化和lint检查。为了确保这些工具设置正确并且按照正确的配置运行,请使用以下make目标。
# Format the entire codebase
make format
# Run clippy on the entire codebase
make lint
很可能会需要在Python包中添加新的功能。这首先需要在新C ABI中暴露新的函数。关于这一点,请参阅Symbolic C-ABI README。
我们强烈建议在虚拟环境中开发和测试Python包。一旦ABI更新并经过测试,请确保虚拟环境处于活动状态并安装包,这将构建本地库。有两种安装方法:
# Install the release build, recommended:
pip install --editable ./py
# Install the debug build, faster installation but much slower runtime:
SYMBOLIC_DEBUG=1 pip install --editable ./py
对于测试,我们使用通用的pytest
。同样,请确保虚拟环境处于活动状态,并且已经安装了最新版本的本地库。然后,运行:
# Run tests manually
pytest ./py/tests
# Creates a new virtualenv, installs the release build and runs tests:
make pytest
示例
存储库包含一些示例,展示了如何使用symbolic
处理调试文件和minidump。这些示例中的大多数也可以用于从这些文件中提取信息或验证它们的完整性。
-
dump_cfi
:将对象文件中的调用帧信息写入标准输出。输出格式是Breakpad的STACK
记录。 -
dump_sources
:从引用对象文件的所有文件创建一个源存档。现在,它已集成到sentry-cli difutil bundle-sources
中。 -
minidump_stackwalk
:从minidump中提取堆栈跟踪并符号化它们。可以指定包含调试信息文件的目录的路径。 -
object_debug
:打印对象文件内容的基本信息。 -
sourcemapcache_debug
:将精简的JavaScript文件及其相应的SourceMap转换为sourcemapcache并解析给定的行/列位置。 -
symcache_debug
:将对象文件转换为symcache并打印其内容。可选地,这可以用来符号化相对地址。 -
unreal_engine_crash
:列出Unreal Engine 4崩溃存档中包含的文件。
要运行这些示例,请使用run
脚本。例如:
./run minidump_stackwalk mini.dmp /path/to/files
许可证
Symbolic在MIT许可证下发布。它使用Apple的一些Apache2许可证代码进行Swift demangling。
lib.rs
:
处理Unreal Engine 4崩溃的API。
依赖项
~6–13MB
~154K SLoC