#stack-trace #symbolic #minidump #unreal-engine #information #breakpad

symbolic-minidump

一个用于处理和检查Minidump崩溃报告的库

76 个稳定版本 (7 个主要版本)

8.8.0 2022年6月15日
8.7.0 2022年3月30日
8.5.0 2021年11月18日
8.3.0 2021年7月7日
1.1.5 2017年12月2日

#10 in #unreal-engine

Download history 3/week @ 2024-03-07 5/week @ 2024-03-14 2/week @ 2024-03-21 52/week @ 2024-03-28 5/week @ 2024-04-04 1/week @ 2024-04-25

每月下载 271

MIT 协议

5.5MB
102K SLoC

C++ 81K SLoC // 0.2% comments Rust 15K SLoC // 0.1% comments C 6K SLoC // 0.1% comments

Symbolic

Build Status codecov

Symbolic 是一个用Rust编写的库,在 Sentry 中用于实现本地堆栈跟踪的符号化、压缩JavaScript的源映射处理等功能。它由多个主要独立的crate组成,这些crate被打包成一个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源映射展开
    • 基本令牌映射
    • 基于压缩源码寻找原始函数名的方法
    • 索引源映射到源映射合并
  • Proguard函数映射
  • 从Mach、ELF和PDB生成Breakpad符号文件
  • 方便的C和Python库
  • 处理Unreal Engine 4原生崩溃报告
    • 提取和处理minidump
    • 公开日志和UE4上下文信息

Rust使用

Rust的crate发布到 Crates.io,文档可在 docs.rs 上查看。

Python使用

Symbolic 项目托管在 PyPI 上。它作为一个库提供预构建的 Linux 和 macOS 轮子。在其他操作系统或用作 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 说明书

源代码包

此库公开的许多功能来自独立的 Rust 源代码包,以提高使用效率。

构建和开发

为了构建 Rust 源代码包,我们需要最新稳定的 Rust,以及一个 C++11 编译器。该源代码包分为一个具有多个功能的 workspace,因此运行构建或测试时,请务必传递 --all--all-features 标志。

# Check whether the crate compiles
cargo check --all --all-features

# Run Rust tests
cargo test --all --all-features

我们使用最新稳定渠道的 rustfmtclippy 进行代码格式化和代码检查。要确保这些工具设置正确且运行配置正确,请使用以下 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。

依赖关系