象征着iPhone应用程序崩溃报告

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

我从iTunes Connect上找到了崩溃报告。我有提交给App Store的应用程序二进制文件,我有作为构建的一部分生成的dSYM文件。

我将所有这些文件放在一个目录中,该目录以spotlight为索引。

现在该做什么?

我试着引用:

symbolicatecrash crashreport.crash myApp.app.dSYM

它只输出与崩溃报告开始时相同的文本,没有符号。

我做错什么了吗?

249520 次浏览

为了表示崩溃,Spotlight必须能够找到与您提交给Apple的二进制文件同时生成的. 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 &存档(也是Xcode 3.2.2的一部分)

神奇的Xcode Organizer并没有那么神奇地象征我的应用程序。我从苹果那里得到的应用程序提交失败的崩溃报告中没有任何符号。

我尝试使用命令行,将崩溃报告与.app文件(我提交给商店的文件)和.dSYM文件放在同一个文件夹中:

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

这只为我的应用程序提供了符号,而不是核心基础代码,但它比Organizer提供给我的数字转储要好,足以让我找到并修复应用程序的崩溃。如果有人知道如何扩展这一点,以获得基金会的符号,这将是赞赏的。

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

  1. 复制发布时推送到appstore的。app文件,发布时创建的。dsym文件和从APPLE接收的崩溃报告到FOLDER

  2. 打开终端应用程序并进入上面创建的文件夹(使用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作为符号-只要用。zip重命名扩展名。IPA,然后我们就可以得到一个包含app的有效载荷文件夹。在这种情况下,我们不需要. dsym文件。

请注意

这只能在应用程序二进制没有符号剥离的情况下工作。默认情况下,发布版本会删除符号。我们可以在项目构建设置“复制过程中的条带调试符号”中将其更改为NO。

更多细节见this 帖子

这是另一个问题,我有符号化崩溃-它不会与应用程序有空间在他们的捆绑(即。“测试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,任务更简单:

  • 组织者开放,
  • 点击左列中的库|设备日志
  • 点击屏幕底部的“进口”按钮…

瞧。日志文件将自动导入并被符号化。前提是你先使用Xcode ->产品->存档存档构建。

我在我的应用程序中使用Airbrake,它在远程错误记录方面做得相当不错。

下面是我如何用atos来表示它们,如果回溯需要的话:

    在Xcode(4.2)转到组织者,右键单击存档从 生成了。ipa文件。李< / p > < / >
  1. 在终端中,cd 到xcarchive,例如MyCoolApp 10-27-11 1.30 PM.xcarchive

  2. 输入如下atos -arch armv7 -o 'MyCoolApp.app'/'MyCoolApp' (不要忘记单引号)

  3. 那通电话里没有我的标志。你得到的是一个空行上的块光标。

  4. 然后我复制/粘贴我的符号代码在那个块光标和按 进入。你会看到如下内容:

    -[MyCoolVC dealloc] (in MyCoolApp) (MyCoolVC.m:34) < / p >

  5. 你又回到了块光标,你可以粘贴其他符号。

能够在不重新进入第一个位的情况下回溯一个项目是一个很好的节省时间的方法。

享受吧!

对于那些使用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实例(即你的构建的存档必须存在于组织者中)。

对我有效的组合是:

  1. 将dSYM文件复制到崩溃报告所在的目录中
  2. 解压包含应用程序的ipa文件(' Unzip MyApp.ipa')
  3. 将结果爆炸有效负载中的应用程序二进制文件复制到与崩溃报告和符号文件相同的文件夹中(类似于“MyApp.app/MyApp”)
  4. 从Xcode的管理器中导入或重新符号化崩溃报告

使用阿托斯,我无法解析正确的符号信息与地址和偏移量,在崩溃报告。当我这样做时,我看到了一些更有意义的东西,它似乎是一个合理的堆栈跟踪。

为了符号化崩溃日志(终于成功了),在阅读了所有这些答案之后,我认为这里有一些非常重要的地方没有被发现,以便确定为什么调用symbolicatcrash不能产生符号化输出。

在表示崩溃日志时,有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的应用程序二进制映像。UUID为aa5e633efda8346cab92b01320043dc3的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

在这个例子中,所有资产都适合在一起,您应该能够符号化您的堆栈跟踪。

继续到symbolicatecrash脚本:

在Xcode 8.3中,你应该能够通过

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log

如果它不存在,你可以在Xcode中运行find . -name symbolicatecrash。应用程序目录找到它。

正如你所看到的,没有给出更多的参数。因此,脚本必须通过运行聚光灯搜索来查找应用程序二进制和调试符号。它使用名为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包,那么symbolicatecrash也不会。如果你做了所有这些事情,例如在~/Desktop的子文件夹中,spotlight应该能够找到所有东西。

如果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

我有点不爽的事实,这里似乎没有什么“只是工作”,所以我做了一些调查,结果是:

设置:接收报告的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"以避开坏字符。

我使用以下步骤成功地做到了这一点。

步骤1:在桌面中创建一个文件夹,我给它命名为“CrashReport”,并放三个文件(“MYApp。应用程序”、“MyApp.app。“MYApp_2013-07-18.crash”)。

打开Finder并进入应用程序,在那里你会找到Xcode应用程序,右键单击它,然后单击“显示包内容”,在这之后遵循这个简单的路径。 “内容- >开发人员- >平台- > iPhoneOS.platform - >开发- >库- > PrivateFrameworks - > DTDeviceKit.framework - >版本- > - >资源”< / p >

“内容- >开发人员- >平台- > iPhoneOS.platform - >开发- >库- > PrivateFrameworks - > DTDeviceKitBase.framework - >版本- > - >资源”

对于Xcode 6及以上的路径是 应用程序/ xcode /内容/ SharedFrameworks / DTDeviceKitBase.framework /版本/ /资源< / p >

在你找到“symbolicatcrash”文件的地方,复制并粘贴到“CrashReport”文件夹。

步骤3:启动终端,运行这3条命令

  1. cd /Users/mac38/Desktop/CrashReport,按“Enter”键

  2. 出口DEVELOPER_DIR = " /应用程序/ Xcode。app/Contents/Developer”,按“Enter”

  3. ./ 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下载崩溃日志。 注意:在大多数情况下,您可能会得到类似于“提交的报告太少而无法显示报告”的内容。基本上没有足够多的用户向苹果提交崩溃日志报告,在这种情况下,你无法做任何事情

enter image description here

enter image description here

2-现在如果你没有改变你的代码,因为你已经提交了你的二进制文件给苹果,然后启动Xcode的项目,并再次执行Product -> Archive。否则,只需找到您最近提交的二进制文件,并右键单击它。

enter image description here

enter image description here

enter image description here

enter image description here

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

步骤

xcode 1. >窗口>设备。

2.从设备部分下的设备列表中选择一个设备。

3.选择“查看设备日志”。

4.在All Logs部分下,您可以直接拖放report.crash

5.Xcode会自动为你生成崩溃报告。

6.您可以通过将符号化崩溃报告的日期/时间与崩溃报告中提到的日期/时间匹配来找到符号化崩溃报告。

我喜欢使用Textwrangler来精确定位原始应用程序上传二进制拒绝中的错误。(崩溃数据将在你的itunesConnect账户中找到。)使用上面萨钦的方法,我复制了原文。崩溃到TextWrangler,然后复制符号崩溃文件,我已经创建到另一个TextWrangler文件。比较这两个文件可以发现不同之处。符号崩溃文件将有差异,指出文件和行数的问题。

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

为xcode 9更新

  1. 连接any iOS设备到你的Mac(是的,物理设备,是的,我知道这很愚蠢)

  2. 在“Window”菜单中选择“Devices” 李enter image description here < / p > < / >

  3. 在左侧单击设备,在右侧单击“查看设备日志” 李enter image description here < / p > < / >

  4. 等待。可能要过一分钟才会出现。也许执行Command-A然后执行Delete将加快此过程。

  5. 将你从iTunesConnect中获得的崩溃报告从.txt扩展名重命名为.crash扩展名

  6. 将崩溃报告拖到左侧区域 李enter image description here < / p > < / >

然后Xcode会将崩溃报告符号化并显示结果。

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

这很简单,在搜索了很多之后,我发现了清晰的步骤来象征整个崩溃日志文件

  • 复制。app, crash_report和DSYM文件到一个文件夹。
  • 用xcode连接设备
  • 进入“->选择设备->查看设备日志”窗口
  • 选中该设备,删除所有日志。
  • 拖放你的崩溃在设备日志部分。它会自动代表坠机。只需右键单击报告并导出它。
< br > < p >幸福的编码, Riyaz < / p >

我更喜欢脚本,它将象征我所有的崩溃日志。

先决条件

创建一个文件夹,放4样东西:

  1. symbolicatecrash perl脚本-有许多SO答案,告诉它的位置

  2. 与崩溃相匹配的构建存档(来自Xcode Organizer)。简单的Show in Finder和复制)[我不确定这是必要的]

  3. 所有的xccrashpoint包-(来自Xcode Organizer。Show in Finder,你可以复制目录中的所有包,或者你想要象征的单个xccrashpoint)

  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 ""
    

The Script

When you run the script, you'll get 2 directories.

  1. allCrashes - all the crashes from all the xccrashpoint will be there.

  2. symboledCrashes - the same crashes but now with all the symbols.

  3. you DON'T need to clean the directory from old crashes before running the script. it will clean automatically. good luck!

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

< p >文档链接: https://docs.fabric.io/apple/crashlytics/missing-dsyms.html#missing-dsyms < / p >

所有关于缺失的dSYMs Fabric包含一个自动上传项目dSYM的工具。该工具通过/run脚本执行,该脚本在入职过程中添加到运行脚本构建阶段。然而,在某些情况下,当dSYM上传失败是因为独特的项目配置,或者如果你在你的应用中使用Bitcode。当上传失败时,Crashlytics无法符号和显示崩溃,“Missing dSYM”警报将出现在你的Fabric仪表板上

可以按照下面列出的步骤手动上传缺失的dsym。

< p >注意: 作为自动化dSYM上传工具的替代方案,Fabric提供了一个命令行工具(upload-symbols),可以手动配置该工具,使其作为项目构建过程的一部分运行。有关配置说明,请参见下面的上传符号部分

...

我发现大多数提议的替代方案在最新的XCode中都不起作用(用XCode 10测试)。例如,我在Xcode -> Organizer -> Device logs -view中拖放.crash日志时没有运气。

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

  • Git克隆Symbolicator存储库,并用Xcode编译和运行
  • 复制.crash文件(ascii文件,请求文件中有堆栈跟踪)和崩溃释放的.xarchive到同一个临时文件夹
  • 拖放.crash文件到Dock中的Symbolicator图标
  • 在5-30秒内,符号崩溃文件将在.crash和.xarchive所在的相同文件夹中生成

对于那些在2022年寻找有效解决方案的人

步骤象征着iPhone应用程序崩溃报告

  • 将apple提供的.txt格式的崩溃日志转换为.crash
  • Xcode > Window > Devices and simulators
  • 必须选择连接的&正在运行ios设备。(不是模拟器,也不是脱机设备)
  • 选择All Logs部分,拖动&删除.crash文件

注意,其他具有symbolicatecrash的解决方案已弃用,其用法显示:

⚠️symbolicatecrash已弃用;它将在Xcode⚠️的未来版本中被删除