Symbolicating iPhone应用程序崩溃报告

问题描述 投票:426回答:25

我期待尝试symbolicate我的iPhone应用程序的崩溃报告。

我取回从iTunes Connect中的崩溃报告。我有我提交到App Store的应用程序二进制和我有一个作为构建的一部分生成的dSYM文件。

我把所有这些文件一起由聚光灯索引单个目录内。

现在怎么办?

我曾尝试调用:

symbolicatecrash crashreport.crash myApp.app.dSYM

它只是输出是在崩溃报告下手,不symbolicated相同的文本。

难道我做错了什么?

ios crash-reports symbolicate
25个回答
688
投票

步骤来分析苹果崩溃报告:

  1. 副本被推到AppStore的释放.app文件,这是在释放和崩溃报告时所创建的文件.dSYM从苹果领取到一个文件夹。
  2. OPEN终端应用程序并进入上面创建的文件夹(使用cd命令)
  3. 运行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


8
投票

在Xcode 4.2.1,打开管理器,然后去图书馆/设备日志并拖动.crash文件到崩溃日志列表。它会在几秒钟后symbolicated你。

请注意,您必须使用原来的构建是在存档的Xcode的同一实例(即您构建存档必须管理存在)。


8
投票

使用的Xcode 4,任务更简单:

  • 开放式管理,
  • 点击库|在左栏设备日志
  • 点击“导入”按钮在屏幕的底部...

就万事大吉了。日志文件导入并自动为您表示。只要你使用存档Xcode的构建 - >产品 - >存档第一。


7
投票

神奇的Xcode组织者是不是不可思议symbolicating我的应用程序。我没有符号在所有的崩溃报告,我从失败提交的应用得到了来自苹果回来。

我尝试使用命令行,把崩溃报告在同一文件夹中.app文件(即我提交到商店)和.dSYM文件:

$ symbolicatecrash "My App_date_blahblah-iPhone.crash" "My App.app"

这仅提供符号,我的应用程序,而不是核心的基础代码,但它比组织者给我,就足以让我找到并修复我的应用程序有崩溃的数量转储更好。如果有人知道如何扩展该得到它,将不胜感激基金会符号。


6
投票

就我而言,我是直接从邮件拖动崩溃报告给主办单位。出于某种原因,应该防止越来越symbolicated(我很想知道为什么)的崩溃报告。

复制崩溃报告到桌面,然后再从那里拖动组织者让他们正确symbolicated。

非常特殊的情况下,我知道了。但想我会分享以防万一。


4
投票

这里还有一个问题,我有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\"";

4
投票

对于使用减速板的,有以上坚实的反应,但不调整它不会为我工作:

适用于一些内存地址,而不是其他人,不知道为什么?

  • 在桌面上或任何地方创建新的目录
  • 在在Xcode组织者的问题查找档案
  • 双击在Finder中透露
  • 双击显示包内容
  • 复制.dSYM文件和.app文件到新的目录
  • cd进入新的目录
  • 运行此命令:ATOS -arch ARMv7的-O 'Vimeo.app'/ '的Vimeo'
  • 终端将进入一个互动的举动
  • 粘贴内存地址并按下回车键,就会输出方法名和行号
  • 另外,输入以下命令:ATOS -arch ARMv7的-O“Vimeo.app” /“的Vimeo”为了获取信息的一个地址只

4
投票

为我工作的组合是:

  1. 在的dSYM文件复制到其中的崩溃报告是目录
  2. 解压缩包含该应用IPA文件(“解压缩MyApp.ipa”)
  3. 应用程序二进制代码从产生的爆炸载荷复制到同一文件夹中的崩溃报告和符号文件(像“MyApp.app/MyApp”)
  4. 导入或重新symbolicate的崩溃报告从Xcode的组织者内

使用ATOS我是不是能够解决与人的崩溃报告的地址和偏移正确的符号信息。当我这样做,我看到的东西更有意义,它似乎是一个合法的堆栈跟踪。


3
投票

我不得不做了很多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;

1
投票

这很简单,搜索了很多,我发现明确的步骤,以symbolicate整个崩溃日志文件之后。

  • 复制一个文件夹中的后缀名为.app,crash_report和DSYM文件。
  • 连接与xcode中设备
  • 然后去窗口 - >选择设备 - >查看设备日志
  • 然后选择该设备,删除所有日志。
  • 拖动和设备日志部分放下你的崩溃。它会自动symbolicate崩溃。只需右键点击报告并导出。

快乐编码, 里亚兹


1
投票

我喜欢一个脚本,将symbolicate我所有的崩溃日志。

前提条件

创建一个文件夹,并把有4件事情:

  1. symbolicatecrash perl脚本 - 有许多SO答案,告诉它的位置
  2. 构建的匹配崩溃的存档(在Xcode的组织者。简单Show in Finder和复印件)[我不知道这是necessery]
  3. 所有xccrashpoint包 - (从Xcode的组织者Show in Finder,你可以复制目录中的所有包,或单xccrashpoint你想symbolicate)
  4. 短脚本添加到目录: #!/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个目录。

  1. allCrashes - 来自所有xccrashpoint的崩溃将在那里。
  2. symboledCrashes - 同样的崩溃,但现在所有的符号。
  3. 你并不需要在运行脚本之前清理旧崩溃的目录。它会自动清理。祝好运!

171
投票

在这里阅读所有这些答案以symbolicate崩溃日志(最终成功),我认为有几点这里缺少的是为了确定为什么symbolicatecrash的调用不会产生symbolicated输出非常重要了。

有3个资产有symbolicating崩溃日志时结合在一起:

  1. 崩溃日志文件本身(即example.crash),无论是从Xcode的组织者出口或从iTunes Connect中收到的。
  2. 所述.app包(即example.app)本身包含属于崩溃日志应用程序二进制文件。如果你有一个.ipa包(即example.ipa),则可以通过解压缩.app包(即.ipa)提取unzip example.ipa包。此后,将包.app驻留在提取Payload/文件夹。
  3. 所述.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


0
投票

为了symbolicate崩溃,聚光灯必须能够发现,在同一时间,你提交给苹果的二进制是生成的.dSYM文件。因为它包含的符号信息,你会倒霉,如果它是不可用的。


0
投票

我来到这里有点脾气暴躁的事实似乎没有任何“只是工作”,所以我做了一些调查,结果是:

设置: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"避开坏字符。


0
投票

ATOS被弃用,所以如果你正在运行OSX 10.9或更高版本,你可能需要运行

xcrun atos

警告:在/ usr / bin中/ ATOS正在并将从未来的OS X版本中删除。现在是在Xcode开发工具可以通过被调用:xcrun atos


0
投票

我喜欢用的TextWrangler精确定位在原始应用程序错误上传二进制拒绝。 (崩溃数据将在您的帐户itunesConnect中找到。)使用萨钦的方法上面我复制到original.crash的TextWrangler,然后复制我创建到另一个文件的TextWrangler的symbolicatecrash文件。这两个文件比较精确定位的差异。该symbolicatecrash文件将具有指出问题的文件和行号的差异。


0
投票

我发现大多数提出的替代方案没有工作在最新的XCode(和Xcode 10测试)。例如,我没有运气拖坠.crash日志在Xcode - >管理 - >设备日志 - 视图。

我建议使用Symbolicator工具https://github.com/agentsim/Symbolicator

  • Git的克隆Symbolicator库和编译和运行的Xcode
  • .crash文件复制(ASCII文件,带有堆栈跟踪文件的乞讨)和.xcarchive崩溃释放相同的临时文件夹中
  • 拖放在码头.crash文件Symbolicator图标
  • 在5-30秒symbolicated崩溃文件在相同的文件夹制作.crash和.xarchive是

-2
投票

我们使用谷歌Crashlytics监督崩溃日志,感觉是非常及时和方便的使用。

文件链接:https://docs.fabric.io/apple/crashlytics/missing-dsyms.html#missing-dsyms

所有关于失踪dSYMs面料包括一个工具来自动上传你的项目的dSYM。该工具通过/运行脚本,这是在入职过程中添加到您的运行脚本生成阶段执行。可能有某些情况下,然而,当上传的dSYM失败,因为独特的项目配置或者如果你在你的应用程序中使用位码。当上载失败,Crashlytics不能symbolicate和显示崩溃,以及“缺少的dSYM”警报将出现在您的面料仪表板。

缺少dSYMs可以手动上传按照以下概述的步骤。

注意:作为对自动化的dSYM上传工具替代,织物提供了一个命令行工具(上传-符号)),其可被手动配置为作为项目的构建过程的一部分来运行。请参阅配置说明上传符号下面的部分。

...


116
投票

在Xcode的最新版本(3.2.2),你可以拖放任何崩溃报告到的Xcode组织者的设备日志部分,他们将自动symbolicated你。我想这样的作品最好的,如果你使用内置构建与归档(也的Xcode 3.2.2的一部分)的应用程序的版本


72
投票

我这样做是成功的,使用以下步骤。

第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

  1. CD /用户/ mac38 /桌面/ CrashReport,然后按Enter键
  2. 出口DEVELOPER_DIR = “/应用/ Xcode.app /内容/开发者”,然后按Enter
  3. ./symbolicatecrash -A -v MYApp_2013-07-18.crash MyApp.app.dSYM,然后按Enter现在,它的完成。(注:约6.4或更高版本没有-A选项 - 就这么走了出来)。

29
投票

步骤自动symbolicate崩溃报告使用的XCode:

更新的XCODE 9

  1. 任何iOS设备连接到Mac(是物理上的,是的,我知道这是愚蠢的)
  2. 从“窗口”菜单中选择enter image description here“设备”
  3. 点击您的设备在左侧,查看设备日志右侧enter image description here
  4. 等待。这可能需要一分钟的时间显示出来。也许做Command-A然后Delete将加速此。
  5. 关键无证步:重命名你从iTunesConnect得到了.txt扩展.crash延伸崩溃报告
  6. 崩溃报告拖动到该区域左侧enter image description here

然后将Xcode中的symbolicate崩溃报告并显示结果。

来源:https://developer.apple.com/library/ios/technotes/tn2151/_index.html


28
投票

我用减速板在我的应用程序,它不远程错误记录的一个相当不错的工作。

以下是我symbolicate他们ATOS如果回溯需要它:

  1. 在Xcode(4.2)去的组织者,右键单击从中生成的.ipa文件存档。
  2. 在终端,用cd命令进入xcarchive例如MyCoolApp 10-27-11 1.30 PM.xcarchive
  3. 输入以下atos -arch armv7 -o 'MyCoolApp.app'/'MyCoolApp'(不要忘了单引号)
  4. 我不包括我在调用符号。你得到的是一个空线的块光标。
  5. 然后我复制/在该块光标,然后按回车贴上我的符号代码。你会看到类似这样的: -[MyCoolVC dealloc] (in MyCoolApp) (MyCoolVC.m:34)
  6. 你回块光标,你可以在其他符号粘贴。

如果能够通过你的回溯一个项目无需重新输入第一位是一个很好的节省时间。

请享用!


28
投票

我也把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


20
投票

只是一个简单的和更新的答案的Xcode 6.1.1。

脚步

1.Xcode>窗口>设备。

从下DEVICES部设备的列表2.选择的装置。

3.Select查看设备日志。

4.Under的所有日志部分,您可以直接拖放的report.crash

5.Xcode会自动Symbolicate崩溃报告给你。

6.You可以找到它的日期/时间与你的崩溃报告中提到的日期/时间匹配Symbolicated崩溃报告。


14
投票

尽管我一直在现在开发了几年的应用程序,这是我第一次调试一个二进制文件,我感觉像一个完整的NOOB搞清楚所有的文件都是即其中为*。应用程序* .dSYM和崩溃日志?我不得不为了弄清楚读取多个职位。图片胜过千言万语,我希望这篇文章可以帮助其他人的未来。

1 - 首先去itunesconnect和下载你的崩溃日志。注意:您可能会收到类似大多数情况下,“太少报告已经提交了要显示的报告。”基本上没有足够多的用户提交的崩溃日志报告,苹果在这种情况下,你不能做更多的事情,在这一点上。

2 - 现在,如果你因为你已经提交你的二进制这苹果并没有改变你的代码,然后启动Xcode中为该项目和做产品 - 再>存档。否则,只要找到你最近提交的二进制文件,并用鼠标右键单击它。

© www.soinside.com 2019 - 2024. All rights reserved.