Build Status Platforms Documentation Matrix

Meter

Meter 是 MetricKit 的配套库。它旨在提供以下功能:

如果您还在寻找一种将 MetricKit 数据传输到服务器的方法,请查看 MeterReporter。它在底层使用了 Meter,并负责处理各种细节。

集成

dependencies: [
    .package(url: "https://github.com/ChimeHQ/Meter")
]

扩展 API

MetricKit 用于崩溃报告的 API 使用起来很不方便。特别是,MXCallStackTree 缺少任何与其结构交互的接口。Meter 包含一些类,可以更轻松地使用它。除了为 MXCallStackTree 提供 API 外,Meter 还包含用于模拟和解析 MetricKit 诊断的类型。

let data = mxTree.jsonRepresentation()
let tree = try CallStackTree.from(data: data)

for frame in tree.callStacks[0].frames {
    print("\(frame.address) \(frame.binaryName) \(frame.binaryUUID)")
}

自定义异常

自 iOS 17、macOS 14、visionOS 1.0 起,MetricKit 确实捕获了未捕获的 NSExceptions。 为了帮助支持较旧的操作系统,以及不源自此功能涵盖位置的异常,还支持自定义异常。 这些异常可以从 NSException 对象创建,它将捕获所有需要的运行时信息来模拟标准的 CallStack

如何实际访问 NSException 不是由 Meter 定义的。 但是,如果您有一个,则 CrashDiagnostic 类型还包括一个 exceptionInfo 属性,可以接受其中一个属性以便于编码。

设备端符号化

MetricKit 提供的堆栈跟踪,与其他类型的崩溃日志一样,没有符号化。 有很多不同的方法来解决这个问题,但一个非常方便的选择是在发生崩溃的设备上将其作为后处理步骤进行。 然而,这确实有一个主要缺点。 它仅在您仍然可以访问相同二进制文件时才有效。 操作系统更新几乎肯定会更改所有操作系统二进制文件。 应用更新也是如此,但在这种情况下,仍然可以使用 dSYM 进行离线符号化步骤。

Meter 提供了一个通过 Symbolicator 协议执行符号化的 API。 该协议的核心应该可用于符号化任何地址,并且不与 MetricKit 相关联。 但是,该协议还包括许多可以对各种 MetricKit 类进行操作的便利方法。 结果使用 Meter 的包装器类来返回包含 symbolInfo 属性的 Frame 实例。 可以直接访问此属性,也可以重新编码以进行传输。

let symbolicator = DlfcnSymbolicator()
let symPayload = symbolicator.symbolicate(payload: diagnosticPayload)

DlfcnSymbolicator

此类实现了 Symbolicator 协议,并使用 dlfcn.h 中的函数来确定符号/偏移量。 这有效,但确实有一些限制。 首先,它依赖于在当前执行的进程中查找符号,因此它仅在当前加载了所需的二进制文件时才有效。

其次,这些函数在 iOS 上为某些二进制文件的符号返回 <redacted>。 我知道符号信息仍然可以从二进制文件中访问,因此不清楚为什么这样做。

这是一个相对便宜的符号化过程,是第一次尝试。 这里肯定有必要进行进一步的工作。

贡献与协作

我很乐意收到您的来信! Issues 或 pull requests 都很好。 Matrix 空间Discord 均可用于实时帮助,但我强烈倾向于以文档的形式回答。 您也可以在 mastodon 上找到我。

我更喜欢协作,如果您有类似的项目,我很乐意找到合作的方式。

我更喜欢用制表符进行缩进以提高可访问性。 但是,我宁愿您使用您想要的系统并创建一个 PR,也不愿因为空格而犹豫。

通过参与此项目,您同意遵守 贡献者行为准则