我正在尝试尝试象征个人iPhone应用程序的崩溃报告。 php
我从iTunes Connect检索了崩溃报告。 我有提交给App Store的应用程序二进制文件,而且有做为生成的一部分生成的dSYM文件。 后端
我将全部这些文件放在一个由Spotlight编制索引的目录中。 api
如今怎么办? xcode
我尝试调用: bash
symbolicatecrash crashreport.crash myApp.app.dSYM
而且只会输出崩溃报告中相同的文本,而不是符号。 服务器
难道我作错了什么? app
对我有用的组合是: 函数
使用atos,我没法使用崩溃报告中的地址和偏移量来解析正确的符号信息。 当我这样作时,我看到了更有意义的东西,而且这彷佛是合法的堆栈跟踪。 ui
在阅读完全部这些答案以表示崩溃日志(并最终成功)以后,我认为这里有些遗漏很是重要,这些点对于肯定为何调用symbolicatecrash不会产生符号化输出很是重要。 this
象征崩溃日志时,必须将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
若是不存在,您能够运行find . -name symbolicatecrash
在Xcode.app目录中使用find . -name symbolicatecrash
进行查找。
如您所见,没有更多的参数了。 所以,脚本必须经过运行Spotlight搜索来找到应用程序二进制文件和调试符号。 它使用名为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
调用了以下所示的Spotlight搜索:
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
。
我对这里彷佛没有什么“正常工做”的事实有点脾气暴躁,因此我作了一些调查,结果是:
设置:接收报告的QuincyKit后端。 没有设置任何符号,由于我什至没法开始弄清楚他们在建议我如何使其起做用。
解决方法:从服务器在线下载崩溃报告。 它们被称为“崩溃”,默认状况下进入〜/ Downloads /文件夹。 考虑到这一点,此脚本将“作正确的事”,崩溃报告将进入Xcode(组织器,设备日志),而且将完成符号化。
剧本:
#!/bin/bash # Copy crash reports so that they appear in device logs in Organizer in Xcode if [ ! -e ~/Downloads/crash ]; then echo "Download a crash report and save it as $HOME/Downloads/crash before running this script." exit 1 fi cd ~/Library/Logs/CrashReporter/MobileDevice/ mkdir -p actx # add crash report to xcode abbreviated cd actx datestr=`date "+%Y-%m-%d-%H%M%S"` mv ~/Downloads/crash "actx-app_"$datestr"_actx.crash"
若是您确实使用QuincyKit / PLCR,则能够经过执行如下两项操做来自动将事情拖放到Xcode Organizer中。
首先,您必须编辑远程脚本admin / actionapi.php〜第202行。它彷佛没有正确的时间戳,所以该文件最终以Xcode没法识别的名称“ crash”结束(它须要某些东西)。点崩溃):
header('Content-Disposition: attachment; filename="crash'.$timestamp.'.crash"');
其次,在iOS端的QuincyKit BWCrashReportTextFormatter.m〜第176行中,将@"[TODO]"
更改成@"TODO"
以避开坏字符。
为了表示崩溃,Spotlight必须可以找到在您提交给Apple的二进制文件的同时生成的.dSYM文件。 因为它包含符号信息,所以若是不可用,您将很不走运。
在运行符号崩溃以前,我还将dsym,应用程序捆绑包和崩溃日志放到了同一目录中
而后,使用在.profile中定义的此函数来简化运行symbolicatecrash的操做:
function desym { /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -A -v $1 | more }
此处添加的参数可能会对您有所帮助。
您能够经过运行如下命令来确保Spotlight能够“看到”您的Dysm文件:
mdfind 'com_apple_xcode_dsym_uuids = *'
查找目录中的dsym。
注意:从最新的Xcode开始,再也不有Developer目录。 您能够在这里找到此实用程序:
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash