我期待尝试symbolicate我的iPhone应用程序的崩溃报告。
我取回从iTunes Connect中的崩溃报告。我有我提交到App Store的应用程序二进制和我有一个作为构建的一部分生成的dSYM文件。
我把所有这些文件一起由聚光灯索引单个目录内。
现在怎么办?
我曾尝试调用:
symbolicatecrash crashreport.crash myApp.app.dSYM
它只是输出是在崩溃报告下手,不symbolicated相同的文本。
难道我做错了什么?
步骤来分析苹果崩溃报告:
cd
命令)atos -arch armv7 -o APPNAME.app/APPNAME MEMORY_LOCATION_OF_CRASH
。存储位置应该在其应用程序崩溃按报告中的一个。例如:atos -arch armv7 -o 'APPNAME.app'/'APPNAME' 0x0003b508
这将告诉你这导致坠毁的确切路线,方法名。
例如:[classname functionName:]; -510
Symbolicating IPA
如果我们用IPA下symbolicating - 只需重命名.zip文件扩展名的.ipa,提取它,然后我们就可以得到包含应用程序有效负载文件夹。在这种情况下,我们并不需要.dSYM文件。
注意
这只能如果应用程序二进制文件不具有符号定义工作。默认情况下,发布版本剥离的符号。我们可以在项目生成设置更改为NO“地带调试符号复制过程中”。
更多详细信息请参阅本post
在Xcode 4.2.1,打开管理器,然后去图书馆/设备日志并拖动.crash文件到崩溃日志列表。它会在几秒钟后symbolicated你。
请注意,您必须使用原来的构建是在存档的Xcode的同一实例(即您构建存档必须管理存在)。
使用的Xcode 4,任务更简单:
就万事大吉了。日志文件导入并自动为您表示。只要你使用存档Xcode的构建 - >产品 - >存档第一。
神奇的Xcode组织者是不是不可思议symbolicating我的应用程序。我没有符号在所有的崩溃报告,我从失败提交的应用得到了来自苹果回来。
我尝试使用命令行,把崩溃报告在同一文件夹中.app文件(即我提交到商店)和.dSYM文件:
$ symbolicatecrash "My App_date_blahblah-iPhone.crash" "My App.app"
这仅提供符号,我的应用程序,而不是核心的基础代码,但它比组织者给我,就足以让我找到并修复我的应用程序有崩溃的数量转储更好。如果有人知道如何扩展该得到它,将不胜感激基金会符号。
就我而言,我是直接从邮件拖动崩溃报告给主办单位。出于某种原因,应该防止越来越symbolicated(我很想知道为什么)的崩溃报告。
复制崩溃报告到桌面,然后再从那里拖动组织者让他们正确symbolicated。
非常特殊的情况下,我知道了。但想我会分享以防万一。
这里还有一个问题,我有symbolicatecrash - 它不会与有空格的束(即“测试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\"";
对于使用减速板的,有以上坚实的反应,但不调整它不会为我工作:
适用于一些内存地址,而不是其他人,不知道为什么?
为我工作的组合是:
使用ATOS我是不是能够解决与人的崩溃报告的地址和偏移正确的符号信息。当我这样做,我看到的东西更有意义,它似乎是一个合法的堆栈跟踪。
我不得不做了很多symbolicatecrash脚本黑客得到它才能正常运行。
据我所知,symbolicatecrash现在需要的.app是在同一目录下.dsym。它将使用.dsym定位。应用程序,但它不会使用DSYM找到符号。
你应该让你的symbolicatecrash的副本尝试这些补丁,这将使它看起来在DSYM之前:
围绕在getSymbolPathFor_dsymUuid函数线212
212 my @executablePath = grep { -e && ! -d } glob("$dsymdir" . "/Contents/Resources/DWARF/" . $executable);
大约在matchesUUID功能线265
265 return 1;
这很简单,搜索了很多,我发现明确的步骤,以symbolicate整个崩溃日志文件之后。
快乐编码, 里亚兹
我喜欢一个脚本,将symbolicate我所有的崩溃日志。
创建一个文件夹,并把有4件事情:
symbolicatecrash
perl脚本 - 有许多SO答案,告诉它的位置Show in Finder
和复印件)[我不知道这是necessery]xccrashpoint
包 - (从Xcode的组织者Show in Finder
,你可以复制目录中的所有包,或单xccrashpoint你想symbolicate)#!/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
- 来自所有xccrashpoint
的崩溃将在那里。symboledCrashes
- 同样的崩溃,但现在所有的符号。在这里阅读所有这些答案以symbolicate崩溃日志(最终成功),我认为有几点这里缺少的是为了确定为什么symbolicatecrash的调用不会产生symbolicated输出非常重要了。
有3个资产有symbolicating崩溃日志时结合在一起:
example.crash
),无论是从Xcode的组织者出口或从iTunes Connect中收到的。.app
包(即example.app
)本身包含属于崩溃日志应用程序二进制文件。如果你有一个.ipa
包(即example.ipa
),则可以通过解压缩.app
包(即.ipa
)提取unzip example.ipa
包。此后,将包.app
驻留在提取Payload/
文件夹。.dSYM
包含调试符号(即example.app.dSYM
)开始symbolication之前,您应该检查是否所有这些文物匹配,这意味着崩溃日志属于你有二进制和调试符号是二进制的构建过程中产生的那些。
每个二进制是可以在崩溃日志文件中看到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
...
在这种提取物的崩溃日志属于具有UUID aa5e633efda8346cab92b01320043dc3
example.app/example命名的应用程序的二进制图像。
你可以检查你有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
在这个例子中所有的资产组合在一起,你应该能够symbolicate您的堆栈跟踪。
在进行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
找到它。
正如你可以看到有没有给出更多的参数。因此脚本有运行Spotlight搜索找到你的应用程序二进制文件和调试符号。它搜索一个名为com_apple_xcode_dsym_uuids
特定索引调试符号。你可以这样做搜索自己:
mdfind 'com_apple_xcode_dsym_uuids = *'
分别。
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
首先聚光灯调用给你所有索引的dSYM包,第二个为您提供了一个特定的UUID的.dSYM
包。如果聚光灯没有找到你的.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
所有这些资源应该打印出你的崩溃日志的symbolicated版本。
如果没有,你可以通过在你的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
注:symbolicated回溯将输出到终端,不symbolicate.log
。
为了symbolicate崩溃,聚光灯必须能够发现,在同一时间,你提交给苹果的二进制是生成的.dSYM文件。因为它包含的符号信息,你会倒霉,如果它是不可用的。
我来到这里有点脾气暴躁的事实似乎没有任何“只是工作”,所以我做了一些调查,结果是:
设置:QuincyKit回接收报告结束。没有symbolication成立,因为我无法甚至开始找出他们建议我做,使之工作。
解决方法:从服务器下载崩溃报告网上。之所以叫“崩溃”,默认情况下进入〜/下载/文件夹中。考虑到这一点,该脚本将“做正确的事”和崩溃报告将进入的Xcode(主办,设备日志)和symbolication将完成。
剧本:
#!/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组织者下降。
首先,你必须编辑远程脚本管理/ 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版本中删除。现在是在Xcode开发工具可以通过被调用:
xcrun atos
我喜欢用的TextWrangler精确定位在原始应用程序错误上传二进制拒绝。 (崩溃数据将在您的帐户itunesConnect中找到。)使用萨钦的方法上面我复制到original.crash的TextWrangler,然后复制我创建到另一个文件的TextWrangler的symbolicatecrash文件。这两个文件比较精确定位的差异。该symbolicatecrash文件将具有指出问题的文件和行号的差异。
我发现大多数提出的替代方案没有工作在最新的XCode(和Xcode 10测试)。例如,我没有运气拖坠.crash日志在Xcode - >管理 - >设备日志 - 视图。
我建议使用Symbolicator工具https://github.com/agentsim/Symbolicator
我们使用谷歌Crashlytics监督崩溃日志,感觉是非常及时和方便的使用。
文件链接:https://docs.fabric.io/apple/crashlytics/missing-dsyms.html#missing-dsyms
所有关于失踪dSYMs面料包括一个工具来自动上传你的项目的dSYM。该工具通过/运行脚本,这是在入职过程中添加到您的运行脚本生成阶段执行。可能有某些情况下,然而,当上传的dSYM失败,因为独特的项目配置或者如果你在你的应用程序中使用位码。当上载失败,Crashlytics不能symbolicate和显示崩溃,以及“缺少的dSYM”警报将出现在您的面料仪表板。
缺少dSYMs可以手动上传按照以下概述的步骤。
注意:作为对自动化的dSYM上传工具替代,织物提供了一个命令行工具(上传-符号)),其可被手动配置为作为项目的构建过程的一部分来运行。请参阅配置说明上传符号下面的部分。
...
在Xcode的最新版本(3.2.2),你可以拖放任何崩溃报告到的Xcode组织者的设备日志部分,他们将自动symbolicated你。我想这样的作品最好的,如果你使用内置构建与归档(也的Xcode 3.2.2的一部分)的应用程序的版本
我这样做是成功的,使用以下步骤。
第1步:创建桌面文件夹,我在给它命名为“CrashReport”,并把三个文件(“MYApp.app”,“MyApp.app.dSYM”,“MYApp_2013-07-18.crash”)。
第2步:打开Finder,去应用,在那里你会发现Xcode应用程序,右击这个和点击“显示包内容”,在此之后按照这个简单的路径。 “内容 - >开发技术>平台 - > iPhoneOS.platform->开发技术>图书馆 - > PrivateFrameworks-> DTDeviceKit.framework->版本 - > A->资源”
要么
“内容 - >开发技术>平台 - > iPhoneOS.platform->开发技术>图书馆 - > PrivateFrameworks-> DTDeviceKitBase.framework->版本 - > A->资源”
要么
对于Xcode的图6和上面的路径是应用/ Xcode.app /内容/ SharedFrameworks / DTDeviceKitBase.framework /版本/ A /资源
当你发现“symbolicatecrash”文件,复制此并粘贴到“CrashReport”文件夹中。
第3步:启动终端,运行这些命令3
更新的XCODE 9
Command-A
然后Delete
将加速此。.txt
扩展.crash
延伸崩溃报告然后将Xcode中的symbolicate崩溃报告并显示结果。
来源:https://developer.apple.com/library/ios/technotes/tn2151/_index.html
我用减速板在我的应用程序,它不远程错误记录的一个相当不错的工作。
以下是我symbolicate他们ATOS如果回溯需要它:
MyCoolApp 10-27-11 1.30 PM.xcarchive
atos -arch armv7 -o 'MyCoolApp.app'/'MyCoolApp'
(不要忘了单引号)-[MyCoolVC dealloc] (in MyCoolApp) (MyCoolVC.m:34)
如果能够通过你的回溯一个项目无需重新输入第一位是一个很好的节省时间。
请享用!
我也把DSYM,应用程序包,和崩溃日志在同一个目录中运行symbolicate飞机坠毁前
然后,我用我的.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的,不再有一个开发目录。你可以在这里找到此实用程序:
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Vers离子/ A /资源/ symbolicatecrash
只是一个简单的和更新的答案的Xcode 6.1.1。
脚步
1.Xcode>窗口>设备。
从下DEVICES部设备的列表2.选择的装置。
3.Select查看设备日志。
4.Under的所有日志部分,您可以直接拖放的report.crash
5.Xcode会自动Symbolicate崩溃报告给你。
6.You可以找到它的日期/时间与你的崩溃报告中提到的日期/时间匹配Symbolicated崩溃报告。
尽管我一直在现在开发了几年的应用程序,这是我第一次调试一个二进制文件,我感觉像一个完整的NOOB搞清楚所有的文件都是即其中为*。应用程序* .dSYM和崩溃日志?我不得不为了弄清楚读取多个职位。图片胜过千言万语,我希望这篇文章可以帮助其他人的未来。
1 - 首先去itunesconnect和下载你的崩溃日志。注意:您可能会收到类似大多数情况下,“太少报告已经提交了要显示的报告。”基本上没有足够多的用户提交的崩溃日志报告,苹果在这种情况下,你不能做更多的事情,在这一点上。
2 - 现在,如果你因为你已经提交你的二进制这苹果并没有改变你的代码,然后启动Xcode中为该项目和做产品 - 再>存档。否则,只要找到你最近提交的二进制文件,并用鼠标右键单击它。