符号化 iPhone 应用程序崩溃报告
-
13-09-2019 - |
题
我想尝试用符号表示我的 iPhone 应用程序的崩溃报告。
我从 iTunes Connect 检索了崩溃报告。我有提交到 App Store 的应用程序二进制文件,还有作为构建的一部分生成的 dSYM 文件。
我将所有这些文件放在一个由聚光灯索引的目录中。
现在怎么办?
我尝试过调用:
symbolicatecrash crashreport.crash myApp.app.dSYM
它只是输出与崩溃报告中相同的文本,而不是符号化的。
难道我做错了什么?
解决方案
分析苹果崩溃报告的步骤:
将推送到应用商店的发布 .app 文件、发布时创建的 .dSYM 文件以及从 APPLE 收到的崩溃报告复制到 文件夹.
打开终端应用程序并转到上面创建的文件夹(使用
cd
命令)跑步
atos -arch armv7 -o APPNAME.app/APPNAME MEMORY_LOCATION_OF_CRASH
. 。根据报告,内存位置应该是应用程序崩溃的位置。
前任: atos -arch armv7 -o 'APPNAME.app'/'APPNAME' 0x0003b508
这将向您显示导致崩溃的确切行、方法名称。
前任: [classname functionName:]; -510
象征性IPA
如果我们使用 IPA 进行符号化 - 只需将扩展名 .ipa 重命名为 .zip ,然后将其解压,然后我们就可以获得一个包含 app 的 Payload 文件夹。在这种情况下,我们不需要 .dSYM 文件。
笔记
仅当应用程序二进制文件没有删除符号时,这才有效。默认情况下,发布版本会删除这些符号。我们可以在项目构建设置中将其“在复制期间剥离调试符号”更改为“否”。
更多详情请看这里 邮政
其他提示
在阅读了此处所有这些答案以符号化崩溃日志(并最终成功)后,我认为这里缺少一些点,这些点对于确定为什么调用 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 引用,可以在崩溃日志文件中看到:
...
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"
第一个聚光灯调用为您提供所有索引的 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
.
在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/cottents/sharedframeworks/dtdevicekitbase.framework/versions/a/a/resources
在找到“symbolicatecrash”文件的地方,将其复制并粘贴到“CrashReport”文件夹中。
步骤3: 启动终端,运行这 3 个命令
cd /Users/mac38/Desktop/CrashReport 并按 Enter 按钮
导出 DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" 并按 Enter
- ./symbolicatecrash -A -v MYApp_2013-07-18.crash MyApp.app.dSYM 并按 Enter 现在完成..(笔记:6.4 左右或更高版本没有 -A 选项——只需将其省略)。
使用 XCode 自动符号化崩溃报告的步骤:
更新为 Xcode 9
连接 任何 iOS 设备到你的 Mac(是的,物理设备,是的,我知道这很愚蠢)
等待。可能需要一分钟才会出现。也许正在做
Command-A
然后Delete
会加快速度。关键的未记录步骤: 重命名您从 iTunesConnect 获得的崩溃报告
.txt
延伸至.crash
扩大
然后Xcode会将崩溃报告符号化并显示结果。
来源: https://developer.apple.com/library/ios/technotes/tn2151/_index.html
我在我的应用程序中使用 Airbrake,它在远程错误记录方面做得相当好。
如果回溯需要的话,我是这样用 atos 来表示它们的:
在Xcode(4.2)中,转到组织者,右键单击生成.IPA文件的存档。
在终端中,cd 进入xcarchive 例如
MyCoolApp 10-27-11 1.30 PM.xcarchive
输入以下内容
atos -arch armv7 -o 'MyCoolApp.app'/'MyCoolApp'
(不要忘记单引号)我没有在该调用中包含我的符号。您得到的是空行上的块光标。
然后,我将符号代码复制/粘贴在该块光标上,然后按Enter。你会看到类似的东西:
-[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一个简单的和更新的答案。
STEPS
1.Xcode>窗口>设备。
2.Select从下DEVICES部的设备的列表的装置。
3.Select查看设备日志。
4.Under的所有日志部分可以直接拖放的report.crash
5.Xcode会自动Symbolicate崩溃报告给你。
6.You可以通过它的日期/时间与/时间在你的崩溃报告中提到的日期匹配找到Symbolicated崩溃报告。
尽管我已经开发了数年的应用程序现在,这是我第一次调试一个二进制文件,我感觉像一个完整的NOOB搞清楚所有的文件都是即哪里是*。应用程序* .dSYM和故障记录?我不得不为了弄清楚读取多个职位。图片胜过千言万语,我希望这篇文章可以帮助别人的未来。
1先去itunesconnect和下载你的崩溃日志。 注意:您可能会收到类似大多数情况下,“太少报告已经提交了要显示的报告。”基本上没有足够多的用户提交的崩溃日志报告,苹果在这种情况下,你不能做更多的事情,在这一点上。
2 - 现在,如果你因为你已经提交你的二进制它随后苹果的Xcode启动该项目,做产品没有改变你的代码 - 再>存档。否则,只要找到你最近提交的二进制文件,并右键点击它。
在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\"";
对于那些使用 Airbrake 的人来说,上面有一个可靠的响应,但如果不进行调整,它对我来说就不起作用:
适用于某些内存地址,但不适用于其他内存地址,不知道为什么......
- 在桌面或任何地方创建新目录
- 在 Xcode 管理器中查找有问题的存档
- 双击即可在取景器中显示
- 双击即可显示捆绑包内容
- 将 .dSYM 文件和 .app 文件复制到新目录中
- cd 到新目录
- 运行这个命令:atos -arch armv7 -o 'Vimeo.app'/'Vimeo'
- 终端将进入互动动作
- 粘贴内存地址并回车,会输出方法名和行号
- 或者,输入以下命令:ATOS -ARCH ARMV7 -O'VIMEO.APP'/'VIMEO'仅获取一个地址的信息
对我有用的组合是:
- 将 dSYM 文件复制到崩溃报告所在的目录中
- 解压包含应用程序的 ipa 文件('unzip MyApp.ipa')
- 将应用程序二进制文件从生成的分解有效负载复制到与崩溃报告和符号文件相同的文件夹中(例如“MyApp.app/MyApp”)
- 从 Xcode 的管理器中导入或重新符号化崩溃报告
使用 阿托斯 我无法使用崩溃报告中的地址和偏移量解析正确的符号信息。当我这样做时,我看到了一些更有意义的东西,它似乎是一个合法的堆栈跟踪。
我不得不做了很多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;
这很简单,经过大量搜索后,我找到了表示整个崩溃日志文件的明确步骤。
- 将 .app 、 crash_report 和 DSYM 文件复制到文件夹中。
- 使用 xcode 连接设备
- 然后进入窗口->选择设备->查看设备日志
- 然后选择该设备,删除所有日志。
- 将崩溃拖放到设备日志部分。它会自动象征崩溃。只需右键单击报告并将其导出即可。
快乐编码,
里亚兹
我更喜欢一个 脚本 这将象征我所有的崩溃日志。
前提条件
创建一个文件夹并放入 4 个东西:
symbolicatecrash
perl 脚本 - 有很多答案可以告诉它的位置与崩溃匹配的构建存档(来自 Xcode Organizer。简单如
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
- 所有的崩溃xccrashpoint
将在那里。symboledCrashes
- 同样的崩溃,但现在带有所有符号。在运行脚本之前,您不需要清除目录中的旧崩溃。它会自动清洁。祝你好运!
为了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 /斌/ ATOS移动并且将从未来OS被移除 X释放。现在是在Xcode开发工具可为 通过调用:
xcrun atos
我喜欢用的TextWrangler精确定位在原始应用程序的错误的二进制上传排斥。 (崩溃数据将在您的帐户itunesConnect中找到。)使用萨钦的方法上面我复制到original.crash的TextWrangler,然后复制我创建到另一个文件的TextWrangler的symbolicatecrash文件。这两个文件比较精确定位的差异。该symbolicatecrash文件将具有指出的问题的文件和行号的差异。
我发现大多数建议的替代方案在最新的 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 相同的文件夹中生成
我们使用谷歌Crashlytics监督崩溃日志,感觉是非常及时和方便的使用。
文档链接: https://docs.fabric.io/apple/crashlytics/缺dsyms.html#缺dsyms
关于缺少dSYMs 面料包括一个工具来自动上传你的项目的dSYM。该工具通过/运行脚本,这是在入职过程中添加到您的运行脚本生成阶段执行。可能有某些情况下,然而,当上传的dSYM失败,因为独特的项目配置或者如果你在你的应用程序中使用位码。当上载失败,Crashlytics不能symbolicate和显示崩溃,以及“缺少的dSYM”警报将出现在你的面料仪表板。
缺少dSYMs可以手动上传按照以下概述的步骤。
注意: 作为替代自动化的dSYM上传工具,Fabric提供一个命令行工具(上传-符号)),其可被手动配置为作为项目的构建过程的一部分来运行。请参见下面的上载的符号部分,用于配置说明。
...