象征iPhone应用崩溃报告

梦想的初衷 提交于 2020-02-28 07:22:32

我正在尝试尝试象征我的iPhone应用程序的崩溃报告。

我从iTunes Connect检索了崩溃报告。 我有提交给App Store的应用程序二进制文件,并且有作为生成的一部分生成的dSYM文件。

我将所有这些文件放在一个由Spotlight编制索引的目录中。

现在怎么办?

我尝试调用:

symbolicatecrash crashreport.crash myApp.app.dSYM

并且只会输出崩溃报告中相同的文本,而不是符号。

难道我做错了什么?


#1楼

对我有用的组合是:

  1. 将dSYM文件复制到崩溃报告所在的目录中
  2. 解压缩包含应用程序的ipa文件(“解压缩MyApp.ipa”)
  3. 将应用程序二进制文件从生成的爆炸有效载荷中复制到崩溃报告和符号文件所在的文件夹中(类似于“ MyApp.app/MyApp”)
  4. 从Xcode的组织器中导入或重新符号化崩溃报告

使用atos,我无法使用崩溃报告中的地址和偏移量来解析正确的符号信息。 当我这样做时,我看到了更有意义的东西,并且这似乎是合法的堆栈跟踪。


#2楼

在阅读完所有这些答案以表示崩溃日志(并最终成功)之后,我认为这里有些遗漏非常重要,这些点对于确定为什么调用symbolicatecrash不会产生符号化输出非常重要。

象征崩溃日志时,必须将3种资产放在一起:

  1. 崩溃日志文件本身(例如example.crash ),可以从XCode的组织者导出,也可以从iTunes Connect接收。
  2. .app包(即example.app )本身包含属于崩溃日志的应用程序二进制文件。 如果您具有.ipa软件包(即example.ipa ),则可以通过解压缩.ipa软件包(即unzip example.ipa )来解压缩.app软件包。 然后, .app包位于提取的Payload/文件夹中。
  3. 包含调试符号的.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目录中使用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"

第一个Spotlight调用为您提供了所有已索引的dSYM包,第二个为您提供了具有特定UUID的.dSYM包。 如果Spotlight找不到您的.dSYM软件包,则symbolicatecrash都不会。 如果您完成所有这些工作,例如在~/Desktop聚光灯的子文件夹中,则应该能够找到所有内容。

如果symbolicatecrash找到您的.dSYM软件包,则在symbolicate.log应该有如下一行:

@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )

为了找到您的.app软件包, symbolicatecrash调用了如下所示的Spotlight搜索:

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


#3楼

我对这里似乎没有什么“正常工作”的事实有点脾气暴躁,所以我做了一些调查,结果是:

设置:接收报告的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无法识别的名称“ crash”结束(它需要某些东西)。点崩溃):

header('Content-Disposition: attachment; filename="crash'.$timestamp.'.crash"');

其次,在iOS端的QuincyKit BWCrashReportTextFormatter.m〜第176行中,将@"[TODO]"更改为@"TODO"以避开坏字符。


#4楼

为了表示崩溃,Spotlight必须能够找到在您提交给Apple的二进制文件的同时生成的.dSYM文件。 由于它包含符号信息,因此如果不可用,您将很不走运。


#5楼

在运行符号崩溃之前,我还将dsym,应用程序捆绑包和崩溃日志放到了同一目录中

然后,使用在.profile中定义的此函数来简化运行symbolicatecrash的操作:

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目录。 您可以在这里找到此实用程序:

/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!