符号化的iPhone应用程序崩溃报告
我正在尝试象征着我的iPhone应用程序的崩溃报告。
我从iTunes Connect中获取了崩溃报告。 我有我提交给App Store的应用程序二进制文件,并具有作为构build的一部分生成的dSYM文件。
我将所有这些文件放在一个由聚光灯索引的单个目录中。
现在怎么办?
我曾尝试调用:
symbolicatecrash crashreport.crash myApp.app.dSYM
它只是输出崩溃报告中的相同文本,而不是象征性的。
我做错了什么?
分析来自苹果的崩溃报告的步骤:
-
复制推送到appstore的release .app文件,发布时创build的.dSYM文件和从APPLE接收到的崩溃报告到FOLDER中 。
-
OPENterminal应用程序并转到上面创build的文件夹(使用
cd
命令) -
运行
atos -arch armv7 -o APPNAME.app/APPNAME MEMORY_LOCATION_OF_CRASH
。 内存位置应该是应用程序根据报告崩溃的位置。
例如: atos -arch armv7 -o 'APPNAME.app'/'APPNAME' 0x0003b508
这会显示导致崩溃的确切的行,方法名称。
例如: [classname functionName:]; -510
[classname functionName:]; -510
象征性的IPA
如果我们使用IPA进行符号化 – 只需使用.zip重命名扩展名为.ipa的文件,将其解压缩即可获得包含应用程序的Payload文件夹。 在这种情况下,我们不需要.dSYM文件。
注意
这只能在应用程序二进制文件没有去除符号的情况下使用。 默认情况下,发布版本剥离了这些符号。 我们可以在项目构build设置“在复制过程中去除debugging符号”中将其更改为NO。
更多细节见这个职位
在阅读所有这些答案后,为了象征一个崩溃日志(并最终成功),我认为这里有一些点是非常重要的,为了确定为什么symbolicatecrash的调用不会产生符号输出。
象征性的崩溃日志中有3个资产必须配合在一起:
- 崩溃日志文件本身(即
example.crash
),从XCode的组织者导出或从iTunes Connect接收。 -
.app
包(即example.app
)本身包含属于崩溃日志的应用程序二进制文件。 如果你有一个.ipa
包(例如example.ipa
),那么你可以通过解压缩.ipa
包(即unzip example.ipa
)来提取.app
包。 之后,.app
软件包驻留在提取的Payload/
文件夹中。 - 包含debugging符号的
.dSYM
包(即example.app.dSYM
)
在开始符号化之前,您应该检查所有这些工件是否匹配,这意味着崩溃日志属于您拥有的二进制文件,并且debugging符号是在该二进制文件的编译期间生成的。
每个二进制文件都由可在崩溃日志文件中看到的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
之后,你应该检查你的debugging符号是否也属于这个二进制文件:
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目录下命名symbolicatecrash来find它。
正如你所看到的,没有更多的参数。 因此,脚本必须通过运行Spotlightsearch来查找应用程序二进制文件和debugging符号。 它使用名为com_apple_xcode_dsym_uuids
的特定索引searchdebugging符号。 你可以自己做这个search:
mdfind 'com_apple_xcode_dsym_uuids = *'
RESP。
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
第一个Spotlight调用为您提供了所有索引的dSYM包,第二个为您提供了具有特定UUID的.dSYM
包。 如果聚光灯没有find您的.dSYM
包,那么symbolicatecrash
将不会。 如果你做所有这些东西,例如在你的~/Desktop
聚光灯的子文件夹中,应该能够find所有东西。
如果symbolicatecrash
find您的.dSYM
包,则应在symbolicate.log
包含以下行:
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
为了find你的.app
包,像以下这样的焦点search被symbolicatecrash
调用:
mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
如果symbolicatecrash
发现你的.app
包,那么symbolicatecrash
应该有下面的提取:
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884 Found executable <SOME_PATH>/example.app/example -- MATCH
如果所有这些资源都是通过symbolicatecrash
find的,它应该打印出你的崩溃日志的符号化版本。
如果没有,你可以直接传入你的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
注意:符号化回溯将输出到terminal,而不是symbolicate.log
。
使用最新版本的Xcode(3.2.2),您可以将任何崩溃报告拖放到Xcode Organizer的“设备日志”部分,它们将自动为您进行符号化。 如果你使用Build&Archive(也是Xcode 3.2.2的一部分)构build了这个版本的应用程序,
我成功了,现在我想和大家分享一下。
这些步骤如下:
第1步:在桌面上创build一个文件夹,我给它命名为“CrashReport”,并把三个文件(“MYApp.app”,“MyApp.app.dSYM”,“MYApp_2013-07-18.crash”)在其中。
第2步:打开Finder,进入应用程序,在那里你会findXcode应用程序,右键单击它并单击“显示包装内容”,然后按照这个简单的path
“Contents-> Developer-> Platforms-> iPhoneOS.platform-> Developer-> Library-> PrivateFrameworks- > DTDeviceKit.framework – > Versions-> A-> Resources”
要么
“Contents-> Developer-> Platforms-> iPhoneOS.platform-> Developer-> Library-> PrivateFrameworks- > DTDeviceKitBase.framework – > Versions-> A-> Resources”
要么
对于Xcode 6及更高版本,path是Applications / Xcode.app / Contents / SharedFrameworks / DTDeviceKitBase.framework / Versions / A / Resources
在哪里find“symboliccrash”文件,将其复制并粘贴到“CrashReport”文件夹中。
第三步:启动terminal,运行这3个命令
-
cd /用户/ mac38 /桌面/ CrashReport,然后按Enterbutton
-
export DEVELOPER_DIR =“/ Applications / Xcode.app / Contents / Developer”并按Enter键
- ./symbolicatecrash -A -v MYApp_2013-07-18.crash MyApp.app.dSYM,然后按回车键完成..(注意:6.4或更高版本没有-A选项 – 只是将其忽略)
快乐编码..谢谢
我在我的应用程序中使用了Airbrake,在远程错误logging方面做得相当不错。
如果回溯需要,我用atos来表示它们的方式:
-
在Xcode(4.2)中,转到pipe理器,右键单击生成.ipa文件的存档。
-
在terminal中,cd 到xcarchive中 ,例如
MyCoolApp 10-27-11 1.30 PM.xcarchive
-
input以下
atos -arch armv7 -o 'MyCoolApp.app'/'MyCoolApp'
(不要忘记单引号) -
在这个电话中我不包括我的标志。 你得到的是一个空行上的块光标。
-
然后,我复制/粘贴我的符号代码块光标,然后按回车。 你会看到像这样的东西:
-[MyCoolVC dealloc] (in MyCoolApp) (MyCoolVC.m:34)
-
你回到一个块光标,你可以粘贴其他符号。
能够通过你的回溯一个项目而不用重新进入第一个位是一个不错的节省时间。
请享用!
在运行符号崩溃之前,我还将dsym,应用程序包和崩溃日志放在同一个目录中
然后我使用在.profile中定义的这个函数来简化运行symbolicatecrash:
function desym { /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -A -v $1 | more }
在那里添加的参数可能会帮助你。
您可以通过运行以下命令来确保聚光灯“看到”您的dysm文件:
mdfind 'com_apple_xcode_dsym_uuids = *'
寻找你的目录中的dsym。
注意:从最新的Xcode开始,不再有一个Developer目录。 你可以在这里find这个工具:
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Vers离子/ A /资源/ symbolicatecrash
只是一个简单的和更新的Xcode 6.1.1的答案。
脚步
1.Xcode>窗口>设备。
2.从“设备”部分的设备列表中select设备。
3.select查看设备日志。
4.在所有日志部分,您可以直接拖放report.crash
5.Xcode会自动为您提供符合的崩溃报告。
6.您可以通过将其date/时间与崩溃报告中提到的date/时间相匹配来查找符号化崩溃报告。
即使我已经开发了几年的应用程序,这是我第一次debugging一个二进制文件,我觉得像一个完整的NOOB计算出所有的文件,即* .app * .dSYM和崩溃日志的位置? 我不得不阅读多个职位,以弄清楚。 图片胜过千言万语,我希望这篇文章能够帮助其他人。
1-首先去itunesconnect并下载你的崩溃日志。 注意:大多数情况下,您可能会收到类似“报告已提交报告显示”的情况。 基本上没有足够的用户向苹果公司提交崩溃日志报告,在这种情况下,你不能做任何事情。
2-现在如果你没有改变你的代码,因为你已经提交你的二进制文件到苹果然后启动该项目的Xcode,并再次执行产品 – >归档。 否则,只要find你最近提交的二进制文件,并右键点击它。
使用XCode自动标记崩溃报告的步骤:
-
连接一个iOS设备到你的Mac(是的一个物理的,是的,我知道这是愚蠢的)
-
从“窗口”菜单中select“设备”
-
点击左侧的设备,然后在右侧查看设备日志
-
等待。 显示可能需要一分钟。 也许做
Command-A
然后Delete
会加快速度。 -
重要的未logging步骤:将您从iTunesConnect从
.txt
扩展名获得的崩溃报告重命名为.crash
扩展名 -
将崩溃报告拖到左侧的区域
然后Xcode将象征着崩溃报告并显示结果。
来源: https : //developer.apple.com/library/ios/technotes/tn2151/_index.html
使用XCode 4,任务更简单:
- 打开组织者,
- 点击Library | 设备login左栏
- 点击屏幕底部的“导入”button…
和voilà。 日志文件将自动导入并符号化。 提供您使用XCode – >产品 – >存档首先存档构build
在XCode 4.2.1中,打开pipe理器,然后进入库/设备日志,并将你的.crash文件拖入到崩溃日志列表中。 几秒钟之后,它会被标记。 请注意,您必须使用与原始构build存档在一起的XCode的相同实例(即您的构build的存档必须存在于pipe理器中)。
神奇的XCode组织者并没有象征我的应用程序那样神奇。 我没有得到任何符号,因为我从一个失败的应用程序提交从苹果回来的崩溃报告。
我尝试使用命令行,将崩溃报告放在与.app文件(我提交给商店)和.dSYM文件相同的文件夹中:
$ symbolicatecrash "My App_date_blahblah-iPhone.crash" "My App.app"
这只提供了我的应用程序的符号,而不是核心的基础代码,但它比组织者给我的数字转储好,足以让我find并修复我的应用程序的崩溃。 如果有人知道如何扩展这个获得基础符号,将不胜感激。
在我的情况下,我直接从邮件拖到崩溃报告组织者。 出于某种原因,这阻止了崩溃报告得到象征(我想知道为什么)。
首先将崩溃报告复制到桌面,然后将它们从那里拖动到组织者让他们适当地符号化。
非常具体的情况,我知道。 但是我以为我会分享以防万一。
这是symboliccrash的另一个问题 – 它不适用于捆绑包中有空格的应用程序(即“Test App.app”)。 注意我不认为在提交时你的名字中可以有空格,所以你应该删除它们,但是如果你已经有了需要分析的崩溃,那么补丁symbolicatecrash(4.3 GM)就是这样的:
240c240 < my $cmd = "mdfind \"kMDItemContentType == com.apple.application-bundle && kMDItemFSName == $exec_name.app\""; --- > my $cmd = "mdfind \"kMDItemContentType == com.apple.application-bundle && kMDItemFSName == '$exec_name.app'\""; 251c251 < my $cmd = "find \"$archive_path/Products\" -name $exec_name.app"; --- > my $cmd = "find \"$archive_path/Products\" -name \"$exec_name.app\"";
对于那些使用Airbrake的人来说,上面有一个可靠的反应,但是如果不进行调整的话,
适用于一些内存地址,但不是其他人,不知道为什么…
- 在桌面或任何地方创build新的目录
- 在Xcode组织者中查找有问题的档案
- 双击在finder中显示
- 点按两次即可显示包裹内容
- 将.dSYM文件和.app文件复制到新的目录中
- cd进入新的目录
- 运行这个命令:atos -arch armv7 -o'Vimeo.app'/'Vimeo'
- terminal将进入一个互动式的移动
- 粘贴到内存地址并回车,将输出方法名称和行号
- 或者,input以下命令:atos -arch armv7 -o'Vimeo.app'/'Vimeo'仅获取一个地址的信息
为我工作的组合是:
- 将dSYM文件复制到崩溃报告所在的目录中
- 解压缩包含应用程序的ipa文件('unzip MyApp.ipa')
- 将应用程序二进制文件从生成的分解负载复制到崩溃报告和符号文件(如“MyApp.app/MyApp”)中相同的文件夹中
- 从XCode的组织者中导入或重新标记崩溃报告
使用atos我无法使用崩溃报告中的地址和偏移量来parsing正确的符号信息。 当我这样做的时候,我看到更有意义的东西,似乎是一个合法的堆栈跟踪。
我不得不做很多symbolicscrash脚本的黑客来让它正常运行。
据我所知,symboliccrash现在需要.app与.dsym位于同一个目录中。 它将使用.dsym来定位.app,但不会使用dsym来查找符号。
在尝试这些补丁程序之前,应该先制作一个symboliccrash的副本,以使其在dsym中显示:
在getSymbolPathFor_dsymUuid函数的第212行左右
212 my @executablePath = grep { -e && ! -d } glob("$dsymdir" . "/Contents/Resources/DWARF/" . $executable);
在linesUUID函数中在265行左右
265 return 1;
这很简单,search了很多后,我发现了清晰的步骤来象征整个崩溃日志文件。
- 将.app,crash_report和DSYM文件复制到文件夹中。
- 用xcode连接设备
- 然后进入窗口 – >select设备 – >查看设备日志
- 然后select这个设备,删除所有日志。
- 拖放设备日志部分的崩溃。 它会自动象征着崩溃。 只需右键单击报告并导出。
快乐的编码,
Riyaz
我更喜欢一个将会象征我所有崩溃日志的脚本 。
前提条件
创build一个文件夹,并把那里4件事情:
-
symbolicatecrash
perl脚本 – 有很多SO答案告诉它的位置 -
与Xcode Organizer相匹配的构build档案(简单的如
Show in Finder
和复制)[我不确定这是否是必要的] -
所有的
xccrashpoint
软件包(从Xcode Organizer。Show in Finder
,你可以复制目录中的所有软件包,或者你想要的单个xccrashpoint) -
将该短脚本添加到目录中:
#!/bin/sh echo "cleaning old crashes from directory" rm -P *.crash rm -P *.xccrashpoint rm -r allCrashes echo "removed!" echo "" echo "--- START ---" echo "" mkdir allCrashes mkdir symboledCrashes find `ls -d *.xccrashpoint` -name "*.crash" -print -exec cp {} allCrashes/ \; cd allCrashes for crash in *.crash; do ../symbolicatecrash $crash > ../symboledCrashes/V$crash done cd .. echo "" echo "--- DONE ---" echo ""
剧本
当你运行脚本时,你会得到2个目录。
-
allCrashes
– 所有allCrashes
所有崩溃都会在那里。 -
symboledCrashes
– 相同的崩溃,但现在所有的符号。 -
在运行脚本之前,不需要清除旧崩溃中的目录。 它会自动清理。 祝你好运!
为了表示崩溃,Spotlight必须能够find在您提交给Apple的二进制文件同时生成的.dSYM文件。 由于它包含符号信息,如果不可用,您将会运气不佳。
我对这个事实似乎有点脾气暴躁,似乎没有什么“只是工作”,所以我做了一些调查,结果是:
设置: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无法识别的名称“崩溃”(它想要的东西点击):
header('Content-Disposition: attachment; filename="crash'.$timestamp.'.crash"');
其次,在QuincyKit BWCrashReportTextFormatter.m〜第176行的iOS端,将@"[TODO]"
更改为@"TODO"
以避开不良的字符。
atos被弃用,所以如果你正在运行OSX 10.9或更高版本,你可能需要运行
xcrun atos
警告:/ usr / bin / atos正在移动,将从未来的OS X版本中删除。 现在可以通过
xcrun atos
调用Xcode开发人员工具
我喜欢使用Textwrangler来查明原始应用程序上传二进制拒绝中的错误。 (崩溃数据将在你的iTunes连接帐户中find。)使用上面的Sachin方法,我将original.crash复制到TextWrangler,然后将我创build的symbolicatecrash文件复制到另一个TextWrangler文件。 比较这两个文件精确的差异。 symboliccrash文件会有差异,指出问题的文件和行号。