在阅读了所有这些答案以符号化崩溃日志(并最终成功)之后,我认为这里缺少一些非常重要的点,以便确定为什么调用 symbolicatecrash 不会产生符号化输出。
符号化崩溃日志时,必须将 3 个资产组合在一起:
- 崩溃日志文件本身(即
example.crash
),从 XCode 的管理器导出或从 iTunes Connect 接收。
- 本身包含属于崩溃日志的应用程序二进制文件的
.app
包(即)。example.app
如果您有一个.ipa
包(即example.ipa
),那么您可以.app
通过解压缩.ipa
包(即unzip example.ipa
)来提取该包。之后,.app
包驻留在提取的Payload/
文件夹中。
- 包含调试符号的
.dSYM
包(即example.app.dSYM
)
在开始符号化之前,您应该检查所有这些工件是否匹配,这意味着崩溃日志属于您拥有的二进制文件,并且调试符号是在构建该二进制文件期间生成的。
每个二进制文件都由一个 UUID 引用,该 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
如果它不存在,您可以find . -name symbolicatecrash
在 Xcode.app 目录中运行以找到它。
如您所见,没有给出更多参数。因此脚本必须通过运行聚光灯搜索来找到您的应用程序二进制文件和调试符号。它使用名为 的特定索引搜索调试符号com_apple_xcode_dsym_uuids
。您可以自己进行此搜索:
mdfind 'com_apple_xcode_dsym_uuids = *'
分别
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
第一个 Spotlight 调用为您提供所有索引的 dSYM 包,第二个为您.dSYM
提供具有特定 UUID 的包。如果聚光灯没有找到您的.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
.