我想尝试和象征我的iPhone应用程序的崩溃报告。
我从iTunes Connect上找到了崩溃报告。我有提交给App Store的应用程序二进制文件,我有作为构建的一部分生成的dSYM文件。
我将所有这些文件放在一个目录中,该目录以spotlight为索引。
现在该做什么?
我试着引用:
symbolicatecrash crashreport.crash myApp.app.dSYM
它只输出与崩溃报告开始时相同的文本,没有符号。
我做错什么了吗?
我想尝试和象征我的iPhone应用程序的崩溃报告。
我从iTunes Connect上找到了崩溃报告。我有提交给App Store的应用程序二进制文件,我有作为构建的一部分生成的dSYM文件。
我将所有这些文件放在一个目录中,该目录以spotlight为索引。
现在该做什么?
我试着引用:
symbolicatecrash crashreport.crash myApp.app.dSYM
它只输出与崩溃报告开始时相同的文本,没有符号。
我做错什么了吗?
在运行symbolicate crash之前,我还将dsym、应用程序包和崩溃日志放在同一个目录中
然后我使用.profile中定义的这个函数来简化运行symbolicatcrash:
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目录。你可以在这里找到这个实用程序:
/应用程序/ xcode /内容/ SharedFrameworks / DTDeviceKitBase.framework /更离子/ /资源/ symbolicatecrash
我不得不对symbolicatecrash脚本进行大量的修改,以使其正常运行。
据我所知,symbolicatcrash现在要求.app和.dsym在同一个目录下。它将使用.dsym来定位.app,但不会使用dsym来查找符号。
在尝试这些补丁之前,你应该复制你的符号化崩溃,这将使它看起来在dsym:
getSymbolPathFor_dsymUuid函数的第212行左右
212 my @executablePath = grep { -e && ! -d } glob("$dsymdir" . "/Contents/Resources/DWARF/" . $executable);
matchesUUID函数的第265行左右
265 return 1;
在最新版本的Xcode(3.2.2)中,你可以拖拽任何崩溃报告到Xcode管理器的设备日志部分,它们会自动为你标记。我认为如果你使用Build & Archive(也是Xcode 3.2.2的一部分)构建那个版本的应用程序,这是最好的工作方式
神奇的Xcode Organizer并没有那么神奇地象征我的应用程序。我从苹果那里得到的应用程序提交失败的崩溃报告中没有任何符号。
我尝试使用命令行,将崩溃报告与.app文件(我提交给商店的文件)和.dSYM文件放在同一个文件夹中:
$ symbolicatecrash "My App_date_blahblah-iPhone.crash" "My App.app"
这只为我的应用程序提供了符号,而不是核心基础代码,但它比Organizer提供给我的数字转储要好,足以让我找到并修复应用程序的崩溃。如果有人知道如何扩展这一点,以获得基金会的符号,这将是赞赏的。
分析苹果崩溃报告的步骤:
将推送到appstore的发布版.app文件、发布时创建的. dsym文件以及从APPLE收到的崩溃报告复制到一个文件夹中。 打开终端应用程序,进入上面创建的文件夹(使用cd命令) 执行命令atos -arch armv7 -o APPNAME。app /浏览器名称MEMORY_LOCATION_OF_CRASH。内存位置应该是应用程序根据报告崩溃的位置。
例如:atos -arch armv7 -o 'APPNAME。应用0 x0003b508”/“浏览器名称”
这将向您显示导致崩溃的确切方法名称。
[classname functionName:];-510年
Symbolicating音标
如果我们使用IPA作为符号-只要用。zip重命名扩展名。IPA,然后我们就可以得到一个包含app的有效载荷文件夹。在这种情况下,我们不需要. dsym文件。
Note
这只能在应用程序二进制没有符号剥离的情况下工作。默认情况下,发布版本会删除符号。我们可以在项目构建设置“复制过程中的条带调试符号”中将其更改为NO。
更多细节请看这篇文章
这是另一个问题,我有符号化崩溃-它不会与应用程序有空间在他们的捆绑(即。“测试App.app”)。注意,我不认为你在提交时可以在他们的名字中有空格,所以你应该删除这些,但如果你已经有需要分析的崩溃,就像这样修补符号崩溃(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\"";
在我的例子中,我直接将崩溃报告从Mail拖到Organizer。出于某种原因,这阻止了坠机报告被符号化(我很想知道为什么)。
首先将崩溃报告复制到桌面,然后将它们从桌面拖动到管理器,这样它们就被正确地符号化了。
我知道,这是非常具体的案例。但以防万一,还是分享一下吧。
使用Xcode 4,任务更简单:
开放的组织者, 单击左列的Library | Device Log 点击屏幕底部的“导入”按钮…
瞧。日志文件将自动导入并被符号化。如果你先使用Xcode -> Product -> Archive存档构建。
我在我的应用程序中使用Airbrake,它在远程错误记录方面做得相当不错。
下面是我如何用atos来表示它们,如果回溯需要的话:
In Xcode (4.2) go to the organizer, right click on the archive from which the .ipa file was generated. In Terminal, cd into the xcarchive for instance MyCoolApp 10-27-11 1.30 PM.xcarchive Enter the following atos -arch armv7 -o 'MyCoolApp.app'/'MyCoolApp' (don't forget the single quotes) I don't include my symbol in that call. What you get is a block cursor on an empty line. Then I copy/paste my symbol code at that block cursor and press enter. You'll see something like: -[MyCoolVC dealloc] (in MyCoolApp) (MyCoolVC.m:34) You're back to a block cursor and you can paste in other symbols.
能够在不重新进入第一个位的情况下回溯一个项目是一个很好的节省时间的方法。
享受吧!
对于那些使用Airbrake的人,上面有一个可靠的回应,但如果不进行调整,它对我来说是无效的:
工作的一些内存地址,但不是其他人,不确定为什么…
在桌面或任何地方创建新目录 在Xcode管理器中找到有问题的存档 双击在查找器中显示 双击显示捆绑包内容 复制。dsym文件和。app文件到新目录 CD进入新目录 atos -arch armv7 -o 'Vimeo.app'/'Vimeo' 终端将进入交互移动 粘贴内存地址并按enter键,它将输出方法名称和行号 或者,输入以下命令:atos -arch armv7 -o 'Vimeo.app'/'Vimeo' 只获取一个地址的信息
在Xcode 4.2.1中,打开管理器,然后进入库/设备日志,将.crash文件拖到崩溃日志列表中。它将在几秒钟后为您显示。
注意,你必须使用与原始版本存档相同的Xcode实例(即,你的版本的存档必须存在于Organizer中)。
对我有效的组合是:
将dSYM文件复制到崩溃报告所在的目录中 解压包含应用程序的ipa文件(' Unzip MyApp.ipa') 将结果爆炸有效负载中的应用程序二进制文件复制到与崩溃报告和符号文件相同的文件夹中(类似于“MyApp.app/MyApp”) 从Xcode的管理器中导入或重新符号化崩溃报告
使用atos时,我无法用崩溃报告中的地址和偏移量解析正确的符号信息。当我这样做时,我看到了一些更有意义的东西,它似乎是一个合理的堆栈跟踪。
为了符号化崩溃日志(终于成功了),在阅读了所有这些答案之后,我认为这里有一些非常重要的地方没有被发现,以便确定为什么调用symbolicatcrash不能产生符号化输出。
在表示崩溃日志时,有3种资产必须组合在一起:
The crash log file itself (i.e. example.crash), either exported from XCode's organizer or received from iTunes Connect. The .app package (i.e. example.app) that itself contains the app binary belonging to the crash log. If you have an .ipa package (i.e. example.ipa) then you can extract the .app package by unzipping the .ipa package (i.e. unzip example.ipa). Afterwards the .app package resides in the extracted Payload/ folder. The .dSYM package containing the debug symbols (i.e. 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
在这个例子中,所有资产都适合在一起,您应该能够符号化您的堆栈跟踪。
接下来是符号化的崩溃脚本:
在Xcode 8.3中,你应该能够通过
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
如果它不在那里,你可以运行一个查找。在你的Xcode中出现符号崩溃。应用程序目录找到它。
正如你所看到的,没有给出更多的参数。因此,脚本必须通过运行聚光灯搜索来查找应用程序二进制和调试符号。它使用名为com_apple_xcode_dsym_uuids的特定索引搜索调试符号。你可以自己搜索:
mdfind 'com_apple_xcode_dsym_uuids = *'
分别。
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
第一个spotlight调用为您提供所有已索引的dSYM包,第二个spotlight调用为您提供具有特定UUID的.dSYM包。如果spotlight没有找到你的. dsym包,那么symbolicatcrash也不会。如果你做了所有这些事情,例如在~/Desktop的子文件夹中,聚光灯应该能够找到所有东西。
如果symbolicatecrash发现了你的.dSYM包,那么在symbolic .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包,那么在symbolic .log中应该有以下摘录:
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
如果所有这些资源都被symbolicatcrash找到,它应该打印出你的崩溃日志的符号化版本。
如果不是,你可以直接传入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
注意:符号化的回溯将输出到终端,而不是symbolic .log。
我有点不爽的事实,这里似乎没有什么“只是工作”,所以我做了一些调查,结果是:
设置:接收报告的QuincyKit后端。没有任何象征意义,因为我甚至不知道他们在建议我怎么做才能让它起作用。
解决办法:从服务器在线下载崩溃报告。它们被称为“crash”,默认情况下进入~/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”结束(它想要一些。crash):
header('Content-Disposition: attachment; filename="crash'.$timestamp.'.crash"');
其次,在iOS端在QuincyKit BWCrashReportTextFormatter。m ~第176行,将@"[TODO]"改为@"TODO"以避开坏字符。
我使用以下步骤成功地做到了这一点。
第一步:在桌面上创建一个文件夹,我给它命名为“CrashReport”,并放三个文件(“MYApp. exe”)。应用程序”、“MyApp.app。“MYApp_2013-07-18.crash”)。
第二步:打开查找器,进入应用程序,在那里你会找到Xcode应用程序,右键单击这个,然后单击“显示包内容”,在这之后按照这个简单的路径。 “内容- >开发人员- >平台- > iPhoneOS.platform - >开发- >库- > PrivateFrameworks - > DTDeviceKit.framework - >版本- > - >资源”
OR
“内容- >开发人员- >平台- > iPhoneOS.platform - >开发- >库- > PrivateFrameworks - > DTDeviceKitBase.framework - >版本- > - >资源”
OR
对于Xcode 6及以上版本,路径为 应用程序/ xcode /内容/ SharedFrameworks / DTDeviceKitBase.framework /版本/ /资源
在你找到“symbolicatcrash”文件的地方,复制并粘贴到“CrashReport”文件夹。
第三步:启动终端,运行这3条命令
cd /Users/mac38/Desktop/CrashReport,按“Enter”键 出口DEVELOPER_DIR = " /应用程序/ Xcode。app/Contents/Developer”,按“Enter” ./ symbolicatcrash -A -v MYApp_2013-07-18.使用实例崩溃MyApp.app.dSYM,然后按Enter现在它完成了。(注意:6.4或更高版本没有-A选项——把它去掉)。
atos已弃用,因此如果您正在运行OSX 10.9或更高版本,您可能需要运行
xcrun atos
警告:/usr/bin/atos正在移动,将从未来的操作系统中删除 X版本。现在可以在Xcode开发工具中使用 通过:xcrun atos调用
尽管我已经开发了几年的应用程序,这是我第一次调试二进制文件,我觉得自己像一个完全的NOOB,弄清楚所有的文件在哪里,即*在哪里。应用程序*。dSYM和崩溃日志?为了弄清楚这个问题,我不得不阅读多篇文章。图片胜过千言万语,我希望这篇文章能在将来对其他人有所帮助。
1-首先去itunesconnect下载你的崩溃日志。 注意:在大多数情况下,您可能会得到类似于“提交的报告太少而无法显示报告”的内容。基本上没有足够多的用户向苹果提交崩溃日志报告,在这种情况下,你什么都做不了。
2-现在如果你没有改变你的代码,因为你已经提交了你的二进制文件给苹果,然后启动Xcode的项目,并再次执行Product -> Archive。否则,只需找到您最近提交的二进制文件,并右键单击它。
只是xcode 6.1.1的一个简单更新的答案。
步骤
xcode 1. >窗口>设备。
2.从设备部分下的设备列表中选择一个设备。
3.选择“查看设备日志”。
4.在All Logs部分下,您可以直接拖放report.crash
5.Xcode会自动为你生成崩溃报告。
6.您可以通过将符号化崩溃报告的日期/时间与崩溃报告中提到的日期/时间匹配来找到符号化崩溃报告。
我喜欢使用Textwrangler来精确定位原始应用程序上传二进制拒绝中的错误。(崩溃数据将在你的itunesConnect账户中找到。)使用上面萨钦的方法,我复制了原文。崩溃到TextWrangler,然后复制符号崩溃文件,我已经创建到另一个TextWrangler文件。比较这两个文件可以发现不同之处。符号崩溃文件将有差异,指出文件和行数的问题。
使用XCode自动生成崩溃报告的步骤:
为xcode 9更新
将任何iOS设备连接到你的Mac(是的,物理设备,是的,我知道这很愚蠢) 从“窗口”菜单中选择“设备” 在左侧单击设备,在右侧单击“查看设备日志” 等待。可能要过一分钟才会出现。也许按Command-A键然后删除可以加快速度。 关键的未记录步骤:将你从iTunesConnect中获得的崩溃报告从.txt扩展名重命名为.crash扩展名 将坠机报告拖到左侧的区域
然后Xcode会将崩溃报告符号化并显示结果。
来源:https://developer.apple.com/library/ios/technotes/tn2151/_index.html
这很简单,在搜索了很多之后,我发现了清晰的步骤来象征整个崩溃日志文件。
复制。app, crash_report和DSYM文件到一个文件夹。 用xcode连接设备 进入“->选择设备->查看设备日志”窗口 选中该设备,删除所有日志。 拖放你的崩溃在设备日志部分。它会自动代表坠机。只需右键单击报告并导出它。
快乐的编码, Riyaz
我更喜欢一个脚本,将象征我的所有崩溃日志。
先决条件
创建一个文件夹,放4样东西:
symbolicatecrash perl script - there are many SO answers that tells it's location The archive of the build that match the crashes (from Xcode Organizer. simple as Show in Finder and copy) [I don't sure this is necessery] All the xccrashpoint packages - (from Xcode Organizer. Show in Finder, you may copy all the packages in the directory, or the single xccrashpoint you would like to symbolicate) Add that short script to the directory: #!/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 ""
这个脚本
运行脚本时,将得到两个目录。
allCrashes -所有来自所有xccrashpoint的所有崩溃都会在那里。 symboledCrashes -相同的崩溃,但现在有了所有的符号。 你不需要在运行脚本之前从旧的崩溃中清理目录。它会自动清洗。好运!
我们使用谷歌Crashlytics来监督崩溃日志,感觉使用起来非常及时和方便。
文档链接: https://docs.fabric.io/apple/crashlytics/missing-dsyms.html#missing-dsyms
All about Missing dSYMs Fabric includes a tool to automatically upload your project’s dSYM. The tool is executed through the /run script, which is added to your Run Script Build Phase during the onboarding process. There can be certain situations however, when dSYM uploads fail because of unique project configurations or if you’re using Bitcode in your app. When an upload fails, Crashlytics isn’t able to symbolicate and display crashes, and a “Missing dSYM” alert will appear on your Fabric dashboard.
可以按照下面列出的步骤手动上传缺失的dsym。
注意: 作为自动化dSYM上传工具的替代方案,Fabric提供了一个命令行工具(upload-symbols),可以手动配置该工具,使其作为项目构建过程的一部分运行。有关配置说明,请参阅下面的上传符号部分。
...
我发现大多数提议的替代方案在最新的XCode中都不起作用(用XCode 10测试)。例如,我在Xcode -> Organizer -> Device logs -view中拖放.crash日志时没有运气。
我推荐使用Symbolicator工具https://github.com/agentsim/Symbolicator
Git克隆Symbolicator存储库,并用Xcode编译和运行 复制.crash文件(ascii文件,请求文件中有堆栈跟踪)和崩溃释放的.xarchive到同一个临时文件夹 拖放.crash文件到Dock中的Symbolicator图标 在5-30秒内,符号崩溃文件将在.crash和.xarchive所在的相同文件夹中生成
对于那些在2022年寻找有效解决方案的人
符号化iPhone应用程序崩溃报告的步骤
将苹果提供的。txt格式的崩溃日志转换为。crash Xcode >窗口>设备和模拟器 必须选择已连接并正在运行的ios设备。(不是模拟器,也不是脱机设备) 选择All Logs部分,拖放.crash文件
请注意,其他具有symbolicatecrash的解决方案已弃用,其用法显示:
⚠️symbolicatecrash已弃用;它将在Xcode⚠️的未来版本中被删除