在这里阅读所有这些答案以符号化崩溃日志(并最终成功)后,我认为这里缺少一些非常重要的点,以便确定为什么调用 symbolicatecrash 不会产生符号化输出。
在符号化崩溃日志时,必须将 3 个资产组合在一起:
- 崩溃日志文件本身(即
example.crash),从 XCode 的管理器导出或从 iTunes Connect 接收。
-
.app 包(即example.app)本身包含属于崩溃日志的应用程序二进制文件。如果您有一个.ipa 包(即example.ipa),那么您可以通过解压缩.ipa 包(即unzip example.ipa)来提取.app 包。之后,.app 包驻留在解压缩的 Payload/ 文件夹中。
- 包含调试符号的
.dSYM 包(即example.app.dSYM)
在开始符号化之前,您应该检查所有这些工件是否匹配,这意味着崩溃日志属于您拥有的二进制文件,并且调试符号是在构建该二进制文件期间生成的。
每个二进制文件都由一个 UUID 引用,可以在崩溃日志文件中看到:
...
Binary Images:
0xe1000 - 0x1f0fff +example armv7 <aa5e633efda8346cab92b01320043dc3> /var/mobile/Applications/9FB5D11F-42C0-42CA-A336-4B99FF97708F/example.app/example
0x2febf000 - 0x2fedffff dyld armv7s <4047d926f58e36b98da92ab7a93a8aaf> /usr/lib/dyld
...
在此提取中,崩溃日志属于名为 example.app/example 且 UUID aa5e633efda8346cab92b01320043dc3 的应用二进制映像。
您可以使用 dwarfdump 检查您拥有的二进制包的 UUID:
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
之后,您应该检查您拥有的调试符号是否也属于该二进制文件:
dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example
在此示例中,所有资产都组合在一起,您应该能够符号化您的堆栈跟踪。
继续执行symbolicatecrash 脚本:
在 Xcode 8.3 中,您应该能够通过
调用脚本
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
如果不存在,您可以在 Xcode.app 目录中运行 find . -name symbolicatecrash 来找到它。
如您所见,没有给出更多参数。因此脚本必须通过运行聚光灯搜索来找到您的应用程序二进制文件和调试符号。它使用名为com_apple_xcode_dsym_uuids 的特定索引搜索调试符号。您可以自己进行此搜索:
mdfind 'com_apple_xcode_dsym_uuids = *'
分别
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
第一个 Spotlight 调用为您提供所有索引的 dSYM 包,第二个为您提供具有特定 UUID 的 .dSYM 包。如果 Spotlight 找不到您的 .dSYM 包,那么 symbolicatecrash 也不会。如果你做所有这些事情,例如在~/Desktop 聚光灯的子文件夹中应该能够找到所有内容。
如果symbolicatecrash 找到你的.dSYM 包,symbolicate.log 中应该有如下一行:
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
为了找到您的.app 包,symbolicatecrash 调用如下的聚光灯搜索:
mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
如果symbolicatecrash 找到你的.app 包,symbolicate.log 中应该有以下摘录:
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
如果symbolicatecrash 找到了所有这些资源,它应该会打印出崩溃日志的符号版本。
如果没有,您可以直接传入您的 dSYM 和 .app 文件。
symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log
注意:符号化的回溯将输出到终端,而不是symbolicate.log。