#r8 #stack-trace #object-file #proguard #retrace

symbolic-proguard

一个用于处理ProGuard和R8映射文件以及符号化优化应用程序帧的库

55个稳定版本 (6个主要版本)

7.5.0 2020年8月21日
7.4.0 2020年6月18日
7.3.3 2020年5月27日
7.2.0 2020年3月24日
1.1.5 2017年12月2日

#26#object-file

Download history 1/week @ 2024-03-26 7/week @ 2024-04-02

每月下载量155

MIT 许可证

105KB
1.5K SLoC

Symbolic

Build Status codecov

Symbolic 是一个用Rust编写的库,在 Sentry 中用于实现本地堆栈跟踪的符号化、压缩JavaScript的源映射处理等功能。它由多个基本独立的crate组成,捆绑成一个C和Python库,以便可以独立于Rust使用。

包中包含的内容

Symbolic提供了以下功能

  • 基于自定义缓存文件(symcache)的符号化
  • 从以下内容生成符号缓存文件
    • Mach、ELF和PE符号表
    • Mach、ELF和PE嵌入的DWARF数据
    • PDB CodeView调试信息
    • .NET可移植PDB
    • Breakpad符号文件
    • Unity IL2CPP
  • 解引用支持
    • C++(GCC、clang和MSVC)
    • Objective C / Objective C++
    • Rust
    • Swift
  • JavaScript源映射扩展
    • 基本令牌映射
    • 基于压缩源查找原始函数名的启发式方法
    • 索引源映射与源映射合并
  • Proguard函数映射
  • 从Mach、ELF和PDB生成Breakpad符号文件
  • 方便的C和Python库
  • 处理Unreal Engine 4本地崩溃报告
    • 提取和处理迷你转储
    • 公开日志和UE4上下文信息

Rust使用方法

Rust crates发布到 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交互。有关更多信息,请参阅Symbolic C-ABI 读取说明

源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

我们使用来自最新稳定通道的 rustfmtclippy 进行代码格式化和 linting。要确保这些工具正确设置并使用正确的配置运行,请使用以下make目标

# Format the entire codebase
make format

# Run clippy on the entire codebase
make lint

新功能很可能还需要添加到Python包中。这首先需要在新C ABI中公开新函数。有关此信息,请参阅Symbolic C-ABI 读取说明

我们强烈建议在虚拟环境中开发和测试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。

依赖关系

~1MB
~12K SLoC