用途:针对 iOS、tvOS、Mac Catalyst、macOS 上 .NET MAUI 与 Mono 应用的崩溃,将 .ips 崩溃日志中的本地回溯帧通过 Mach-O UUID 与 dSYM 调试符号还原为函数名、源文件和行号。
输入:.ips JSON 格式崩溃日志(iOS 15+/macOS 12+)、atos(随 Xcode 提供),可选连接 iOS 设备以提取崩溃日志。不适用于非 .NET 组件崩溃(如纯 Swift/UIKit),也不适用于 Android tombstone。
流程:先校验文件为 .ips JSON,第一行为元数据头,其余为崩溃主体,分别解析;关注 usedImages 的 base/uuid/arch、threads[].frames 的 imageOffset/imageIndex、exception、asi、lastExceptionBacktrace、faultingThread。部分文件存在大小写冲突键(vmRegionInfo/vmregioninfo),需预处理重命名。随后过滤 .NET 运行时库(如 libcoreclr、libmonosgen-2.0、libSystem.Native 等),注意 Apple 平台上它们以 .framework 分发,名称可能不含 .dylib,用子串匹配。之后先看 asi 中的托管异常信息,再检查出错线程,并查看 lastExceptionBacktrace。
定位 dSYM:可从 Microsoft 符号服务器下载 .dwarf 并转为 dSYM(用 dwarfdump 校验 UUID 一致),或用构建产物、SDK 包、NuGet 缓存、dotnet-symbol。符号化使用 atos,需指定 -arch、-o(指向 DWARF 二进制而非 bundle)、-l 载入地址,可批量传入地址。脚本 scripts/Symbolicate-Crash.ps1 可自动化全流程,支持 -ParseOnly、-SkipSymbolDownload、-SymbolCacheDir 等参数。设备日志可用 idevicecrashreport 提取,也可在 Xcode 设备日志或 ~/Library/Logs 相关目录找到。
验证与限制:需确认 dSYM UUID 与日志匹配、至少一个 .NET 帧解析成功;格式不符或无 .NET 帧时应停止并报告,不安装 Xcode,若 atos 不可用则给出手动命令。