象征性地 iPhone 应用程序崩溃报告

Symbolicating iPhone App Crash Reports

提问人:Jasarien 提问时间:9/22/2009 最后编辑:ROMANIA_engineerJasarien 更新时间:9/11/2022 访问量:251187

问:

我想尝试将我的 iPhone 应用程序的崩溃报告符号化。

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

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

现在怎么办?

我试过调用:

symbolicatecrash crashreport.crash myApp.app.dSYM

它只是输出与崩溃报告中相同的文本,而不是符号化。

我做错了什么吗?

iOS 崩溃报告 符号

评论

3赞 Sam 12/28/2011
你也可以在iPhone SDK上看到我的答案:symbolicatecrash.sh 位于哪里?。我列出了在哪里可以找到该命令,如何使用它,以及如何找到执行符号化所需的dSYM文件。symbolicatecrash
6赞 logancautrell 4/3/2012
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash
5赞 amleszk 8/31/2012
我创建了一个可能有帮助的脚本:github.com/amleszk/scripts/blob/master/......
1赞 Sam B 7/7/2014
如果有人想知道你在哪里可以得到*.app,*.dSYM和崩溃日志,那么看看下面的答案。
4赞 Mrug 5/25/2015
您可以参考这个: medium.com/@Mrugraj/crash-re-symbolication-5c28d3a3a883

答:

0赞 rpetrich 9/23/2009 #1

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

评论

0赞 Jasarien 9/23/2009
如果您阅读了这个问题,我说过我已经保存了在提交二进制文件的同时生成的原始 dSYM 文件。
28赞 Kendall Helmstetter Gelner 9/23/2009 #2

在运行 symbolicate crash 之前,我还将 dsym、app bundle 和 crash log 放在同一个目录中

然后,我使用我的 .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/Vers ions/A/Resources/symbolicatecrash

评论

1赞 Jasarien 9/23/2009
我查看了 mdfind 输出,聚光灯肯定可以看到 dSYM 文件。但是,symbolicatecrash 脚本仍然不会输出与崩溃报告本身不同的任何内容。即使使用您提供的参数。
0赞 Kendall Helmstetter Gelner 9/24/2009
如果找不到 dsym,脚本应该在开头生成一些警告文本 - 你能寻找它并看看它说了什么吗?
0赞 Kendall Helmstetter Gelner 9/24/2009
另外,尝试在命令后添加“.”,因此它将是“symbolicatecrash -A -v MyApp.crashlog”。如果它尚未这样做,这将强制它在当前目录中查找。
0赞 bpapa 12/20/2009
意思是“无法执行”/usr/bin/xcode-select“:/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneRemoteDevice.xcodeplugin/Contents/Resources/symbolicatecrash 第 49 行没有这样的文件或目录。
0赞 bpapa 12/20/2009
哎呀,显然那个 stackoverflow.com/questions/1859852/ 还有另一个 SO 问题......
3赞 JerryH 1/27/2010 #3

我不得不对 symbolicatecrash 脚本进行大量破解才能使其正常运行。

据我所知,symbolicatecrash 现在要求 .app 与 .dsym 位于同一目录中。它将使用 .dsym 来查找 .app,但不会使用 dsym 来查找符号。

在尝试这些补丁之前,您应该复制 symbolicatecrash,这将使它在 dsym 中看起来:

在getSymbolPathFor_dsymUuid函数中的第 212 行周围

212     my @executablePath = grep { -e && ! -d } glob("$dsymdir" . "/Contents/Resources/DWARF/" . $executable);

matchesUUID 函数中的第 265 行左右

265             return 1;
115赞 Alan Rogers 4/20/2010 #4

使用最新版本的 Xcode (3.2.2),您可以将任何崩溃报告拖放到 Xcode 管理器的“设备日志”部分,它们将自动为您符号化。我认为,如果您使用 Build & Archive(也是 Xcode 3.2.2 的一部分)构建该版本的应用程序,效果最好

评论

3赞 Adam 6/2/2011
在全新安装时,这根本不适用于 Xcode4。似乎是一个新的错误:(
1赞 Alan Rogers 6/2/2011
我不确定这是否能解决您遇到的相同问题,但有人已经修补了 YMMV github.com/nskboy/symbolicatecrash-fix 符号脚本:)
2赞 harshit2811 11/4/2011
此技巧适用于 Xcode 4.2。将崩溃日志放在管理器的设备日志中。重新启动管理器将获得符号化的崩溃日志!!谢谢。
2赞 Sam 12/28/2011
当我从另一台计算机导入存档文件以获取崩溃日志时,我无法做到这一点。:(出于这个原因,我不得不手动对文件进行符号化。您可以在此处找到有关如何进行符号化的步骤: iPhone SDK:symbolicatecrash.sh 位于何处?
3赞 Dmitry 10/5/2013
从iTunes Connect下载的崩溃报告对我不起作用。
7赞 AndrewS 10/12/2010 #5

神奇的 Xcode Organizer 在象征我的应用程序方面并不那么神奇。我从失败的应用程序提交中从 Apple 收到的崩溃报告根本没有收到任何符号。

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

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

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

评论

0赞 harunaga 9/13/2019
对于核心基金会 dSYM,一个(可能是中国人)的人将 dSYM 上传到他共享的谷歌驱动器上,只需下载它并放入“设备支持”文件夹,它就会得到解决。github.com/Zuikyo/iOS-System-Symbols
698赞 Naveen Shan 2/10/2011 #6

分析Apple崩溃报告的步骤:

  1. 将推送到应用商店的发布.app文件、发布时创建的 .dSYM 文件以及从 APPLE 收到的崩溃报告复制到文件夹中

  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

IPA的象征

如果我们使用 IPA 进行符号化 - 只需使用 .zip 重命名扩展名 .ipa,提取它,然后我们就可以得到一个包含应用程序的有效负载文件夹。在这种情况下,我们不需要 .dSYM 文件。

注意

仅当应用程序二进制文件未剥离符号时,这才有效。默认情况下,发布版本会剥离符号。我们可以在项目构建设置“复制过程中剥离调试符号”中将其更改为 NO。

更多细节,请参阅此帖子

评论

12赞 loretoparisi 8/26/2011
只是一个@NaveenShan答案的提示,一个真实世界的例子可以做到这一点,你会得到atos -o myApp.app/Contents/MacOS/myApp 0x0000000100001f2c-[HUDWindow sizedHUDBackground] (in myApp) + 1197
4赞 Oscar 2/8/2012
但是,您使用哪个地址?日志在每个函数之后有两列地址,第二列有 + 和某种偏移量。比如 0x332da010 0x332d9000 + 4112。
8赞 Naveen Shan 2/8/2012
@OscarGoldman 第二个地址,例如:- 在 0x332da010 0x332d9000 + 4112 中。使用0x332d9000。
4赞 Paul Ardeleanu 3/12/2012
此外,如果在没有地址的情况下使用,它允许您通过逐个提交来分析多个位置。
44赞 Kerni 2/22/2013
这个答案存在多个问题: 1.这只有在应用程序二进制文件没有剥离符号的情况下才有效。默认情况下,发布版本确实会剥离它们。2.即使符号可用,也永远不会显示行号。只有使用 dSYM 进行符号化才能提供这一点。3. 您不能简单地使用堆栈跟踪中显示的内存地址,该地址必须根据应用程序加载到的起始内存地址进行规范化。更多细节请看这个答案:stackoverflow.com/questions/13574933/...
4赞 Alastair Stuart 3/7/2011 #7

这是我在 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\"";

评论

0赞 Alastair Stuart 8/12/2011
为了它的价值,我在这个上面填写了一个 rdar,它被固定在 [已编辑]
6赞 samvermette 4/5/2011 #8

就我而言,我将崩溃报告直接从邮件拖到组织者。出于某种原因,这阻止了崩溃报告被符号化(我很想知道为什么)。

首先将崩溃报告复制到桌面,然后将它们从那里拖到管理器中,可以正确地符号化它们。

非常具体的情况,我知道。但我想我会分享以防万一。

评论

0赞 Jasarien 4/5/2011
我想这可能与聚光灯有关。组织者保存日志的位置是否有可能没有被 spotlight 索引?
8赞 Sébastien Stormacq 6/15/2011 #9

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

  • 打开管理器
  • 单击“库”|”左列中的设备日志
  • 点击屏幕底部的“导入”按钮...

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

评论

1赞 Russian 6/22/2011
奇怪的是,导入没有效果。放置.app,.dSYM和.crash,然后在.crash文件上运行symbolicatecrash(没有任何其他参数)虽然有效(XCode 4)
28赞 averydev 10/28/2011 #10

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

如果回溯需要,我用 atos 来象征它们的方式如下:

  1. 在 Xcode (4.2) 中,转到管理器,右键单击 生成 .ipa 文件。

  2. 例如,在终端中,cd 进入 xcarchiveMyCoolApp 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. 您将返回到块光标,您可以粘贴其他符号。

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

享受!

4赞 Alfie Hanssen 1/11/2012 #11

对于那些使用 Airbrake 的人来说,上面有一个可靠的响应,但如果不进行调整,它对我不起作用:

适用于某些内存地址,但不适用于其他内存地址,不知道为什么......

  • 在桌面或任何地方创建新目录
  • 在 Xcode 管理器中查找有问题的存档
  • 双击以在取景器中显示
  • 双击以显示捆绑包内容
  • 将 .dSYM 文件和 .app 文件复制到新目录中
  • cd 进入新目录
  • 运行以下命令:atos -arch armv7 -o 'Vimeo.app'/'Vimeo'
  • 终端将进入交互式移动
  • 粘贴内存地址并按回车键,它将输出方法名称和行号
  • 或者,输入以下命令:atos -arch armv7 -o 'Vimeo.app'/'Vimeo' 仅获取一个地址的信息
8赞 cberkley 1/28/2012 #12

在 Xcode 4.2.1 中,打开管理器,然后前往“资源库/设备日志”,将 .crash 文件拖到崩溃日志列表中。几秒钟后,它将为您象征化。

请注意,您必须使用原始构建存档的相同 Xcode 实例(即构建的存档必须存在于 Organizer 中)。

4赞 Sean Aitken 11/2/2012 #13

对我有用的组合是:

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

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

178赞 Andreas Klöber 12/2/2012 #14

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

在对崩溃日志进行符号化时,必须将 3 个资产组合在一起:

  1. 崩溃日志文件本身(即 ),可以从 XCode 的管理器导出或从 iTunes Connect 接收。example.crash
  2. 本身包含属于崩溃日志的应用程序二进制文件的包(即 )。如果您有一个包(即 ),那么您可以通过解压缩包(即 )来解压缩该包。之后,包将驻留在解压缩的文件夹中。.appexample.app.ipaexample.ipa.app.ipaunzip example.ipa.appPayload/
  3. 包含调试符号的包(即.dSYMexample.app.dSYM)

在开始符号化之前,应检查所有这些工件是否匹配,这意味着崩溃日志属于你拥有的二进制文件,并且调试符号是在构建该二进制文件期间生成的符号。

每个二进制文件都由一个 UUID 引用,该 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 with 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

如果它不存在,您可以在 Xcode.app 目录中运行 一个 来找到它。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 包,第二个调用为您提供具有特定 UUID 的包。如果聚光灯没有找到您的包裹,那么两者都找不到。如果你做了所有这些事情,例如在聚光灯的子文件夹中,应该能够找到所有内容。.dSYM.dSYMsymbolicatecrash~/Desktop

如果找到您的包,则应该有一行,如下所示:symbolicatecrash.dSYMsymbolicate.log

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

为了查找您的包,将调用如下所示的聚光灯搜索:.appsymbolicatecrash

mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"

如果找到您的包,则应包含以下摘录:symbolicatecrash.appsymbolicate.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

评论

4赞 jere 2/20/2013
我可以找到所有文件,但是我得到了这个,并且没有符号输出No crash report version in testlog.crash at /usr/bin/symbolicatecrash line 921.
1赞 Hrissan 8/14/2013
这真的很有帮助!就我而言,.app 文件的名称与可执行文件名称不同(我不知道为什么,但它是由 Xcode 以这种方式构建的)。在 XCode 存档中重命名 .app 文件后,符号化确实起作用了。
30赞 Eliot 9/22/2013
这是一个很好的解释,应该是IMO的最佳答案,谢谢。请注意,如果脚本像这样抱怨环境变量,则可能需要设置环境变量: .我将这一行添加到我的 .查看 stackoverflow.com/q/11682789/350761DEVELOPER_DIRexport DEVELOPER_DIR=`xcode-select --print-path` ~/.bash_profile
1赞 Eliot 11/26/2013
请注意,对于 Xcode 5,这已移至:<PATH_TO_Xcode.app>/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/Current/Resources/symbolicatecrash
1赞 benuuu 12/22/2016
Symbolicate Crash 也有几个有用的选项。<SYMBOL_PATH> Additional search paths in which to search for symbol rich binaries -o | --output <OUTPUT_FILE> The symbolicated log will be written to OUTPUT_FILE. Defaults to "-" (i.e. stdout) if not specified -d | --dsym <DSYM_BUNDLE> Adds additional dSYM that will be consulted if and when a binary's UUID matches (may be specified more than once)
0赞 Kalle 1/10/2013 #15

我有点脾气暴躁,因为这里似乎没有什么“只是工作”,所以我做了一些调查,结果是:

设置:接收报告的 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"

75赞 SachinVsSachin 7/19/2013 #16

我使用以下步骤成功地完成了此操作。

步骤1:在桌面上创建一个文件夹,我将其命名为“CrashReport”,并在其中放置三个文件(“MYApp.app”、“MyApp.app.dSYM”、“MYApp_2013-07-18.crash”)。

步骤2:打开Finder并转到应用程序,您将在其中找到Xcode应用程序,右键单击此应用程序,然后单击“显示包内容”,然后按照此简单路径进行操作。 “Contents->Developer->Platforms->iPhoneOS.platform->Developer->Library->PrivateFrameworks->DTDeviceKit.framework->Versions->A->Resources”

“Contents->Developer->Platforms->iPhoneOS.platform->Developer->Library->PrivateFrameworks->DTDeviceKitBase.framework->Versions->A->Resources”

对于 Xcode 6 及更高版本,路径为 Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

在找到“symbolicatecrash”文件的地方,将其复制并粘贴到“CrashReport”文件夹中。

第 3 步:启动终端,运行这 3 个命令

  1. cd /Users/mac38/Desktop/CrashReport 并按 Enter 按钮

  2. export DEVELOPER_DIR=“/Applications/Xcode.app/Contents/Developer”并按 Enter 键

  3. ./symbolicatecrash -A -v MYApp_2013-07-18.crash MyApp.app.dSYM 并按 Enter 键 现在完成。.(注意:6.4 或更高版本的版本没有 -A 选项 - 只需将其省略即可)。

评论

3赞 Ryan Heitner 2/1/2015
对于DTServiceKit,请在Applications/Xcode.app/Contents/SharedFrameworks中查找
3赞 Matt Fiocca 4/10/2015
谢谢 谢谢...截至 2015 年 4 月 9 日,这对我来说是完美的。一件事,是我得到了 symbolicatecrash,但该过程仍然运行了Unknown option: A
1赞 Chad Robinson 7/7/2015
我希望我能给这个答案一千分。关于这个话题有很多操作方法......但这是在最低级别工作的那个,所以它总是有效的。在后面敲击所有步骤是一件很痛苦的事情,但是当其他一切都失败时,这就可以完成这项工作。
0赞 user1256018 11/26/2013 #17

atos 已被弃用,因此如果您运行的是 OSX 10.9 或更高版本,则可能需要运行

xcrun atos

警告:/usr/bin/atos 正在移动,将从未来的操作系统中删除 X 发布。它现在可以在 Xcode 开发者工具中使用 通过以下方式调用:xcrun atos

评论

0赞 David Gish 1/8/2015
似乎苹果允许DWARF格式随着工具的每个版本而变化(这是有道理的,特别是随着Swift的出现),所以他们把它转移到了工具发行版。
14赞 Sam B 7/7/2014 #18

尽管我已经开发应用程序几年了,但这是我第一次调试二进制文件,我感觉自己像一个完整的菜鸟,弄清楚所有文件的位置,即*.app *.dSYM和崩溃日志在哪里?为了弄清楚,我不得不阅读多篇文章。图片胜过千言万语,我希望这篇文章将来能帮助到其他人。

1-首先转到itunesconnect并下载崩溃日志。 注意:在大多数情况下,您可能会收到类似“提交的报告太少,无法显示报告”之类的信息。基本上,没有足够的用户向Apple提交崩溃日志报告,在这种情况下,您此时无法做任何事情。

enter image description here

enter image description here

2-现在,如果您在将二进制文件提交给Apple后没有更改代码,则启动该项目的Xcode并再次执行Product --> Archive。否则,只需找到您最新提交的二进制文件并右键单击它。

enter image description here

enter image description here

enter image description here

enter image description here

21赞 Aditya Aggarwal 2/2/2015 #19

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

步骤

1.Xcode>Window>Devices。

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

3.选择查看设备日志。

4.在“所有日志”部分下,您可以直接拖拽 report.crash

5.Xcode会自动为您符号化崩溃报告。

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

评论

3赞 Tony 5/17/2015
我从Apple解决方案中心下载的崩溃报告通常具有.txt扩展名。请记住将它们重命名为 .crash,否则设备日志可能会拒绝添加它们。适用于我当前的 XCode 6.3.1
3赞 Giammy 8/21/2016
这是 Apple 的官方程序。应该是答案。Apple 链接:技术说明 TN2151:了解和分析 iOS 应用程序崩溃报告
0赞 galactikuh 1/6/2018
如果崩溃来自Apple / iTunesConnect,我们该怎么做?换句话说,我们实际上并不知道或拥有发生崩溃的设备?
0赞 Mountain Man 6/10/2016 #20

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

37赞 William Entriken 6/23/2016 #21

使用 XCode 自动符号化崩溃报告的步骤:

针对 XCODE 9 进行了更新

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

  2. 从“窗口”菜单中选择“设备”enter image description here

  3. 单击左侧的设备,右侧的 VIEW DEVICE LOGSenter image description here

  4. 等。可能需要一分钟才能显示。也许这样做会加快速度。Command-ADelete

  5. 未记录的关键步骤:将您从 iTunesConnect 获得的崩溃报告从扩展重命名为扩展.txt.crash

  6. 将崩溃报告拖动到左侧的该区域enter image description here

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

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

评论

1赞 Giammy 8/21/2016
这是 Apple 的官方程序。应该是答案。
2赞 William Entriken 1/5/2017
谢谢,我现在正在添加图片。还包括 SUPER UNDOCUMENTED 步骤。我想过制作一个红色文本并将其拼接在一起,这样它就会真正脱颖而出。然后我就不再去想那个了。
1赞 galactikuh 1/6/2018
谢谢!实际上,没有其他答案说您使用的设备不需要是发生崩溃的设备(甚至设备类型)。
0赞 gregthegeek 11/22/2019
快速说明,因为对我来说它不会重新象征。我还必须打开 Organizer,单击 Archives 中的构建,单击 Download Debug Symbols。然后,我可以在设备日志视图中重新符号化。这是在评论被拒绝后从 Apple 下载的崩溃日志。
2赞 Shaik Riyaz 2/15/2017 #22

这很简单,在搜索了很多之后,我找到了明确的步骤来符号化整个崩溃日志文件。

  • 将 .app、crash_report 和 DSYM 文件复制到文件夹中。
  • 将设备与 Xcode 连接
  • 然后进入窗口 -> 选择设备 -> 查看设备日志
  • 然后选择此设备,删除所有日志。
  • 将崩溃拖放到设备日志部分。它会自动象征崩溃。只需右键单击报告并将其导出即可。

快乐编码,
里亚兹

评论

0赞 Ninad Kambli 2/16/2017
最好的简短和甜蜜的 ans,遵循本 ans 中写的每一步。developer.apple.com/library/content/technotes/tn2151/......点击此链接,了解未符号化和完全符号化之间的区别。
1赞 Yitzchak 5/7/2017 #23

我更喜欢一个可以象征我所有崩溃日志的脚本

前提 条件

创建一个文件夹并放在那里 4 件事:

  1. symbolicatecrashperl 脚本 - 有许多 SO 答案可以告诉它的位置

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

  3. 所有软件包 - (从 Xcode Organizer. ,您可以复制目录中的所有软件包,或者您想要符号化的单个 xccrashpoint)xccrashpointShow in Finder

  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. 在运行脚本之前,您不需要从旧的崩溃中清除目录。它会自动清洁。祝你好运!

-2赞 Tim 1/5/2018 #24

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

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

关于缺少 dSYM Fabric 包含一个工具,用于自动上传项目的 dSYM。该工具通过 /run 脚本执行,该脚本在载入过程中添加到运行脚本生成阶段。但是,在某些情况下,当 dSYM 上传由于独特的项目配置或您在应用中使用 Bitcode 而失败时。当上传失败时,Crashlytics 无法符号化和显示崩溃,并且 Fabric 仪表板上会出现“缺少 dSYM”警报。

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

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

...

1赞 Erkki Nokso-Koivisto 11/20/2018 #25

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

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

  • Git clone Symbolicator 存储库,并使用 Xcode 编译和运行
  • 将 .crash 文件(ascii 文件,在乞求文件时带有堆栈跟踪)和崩溃版本的 .xarchive 复制到同一个临时文件夹
  • 将 .crash 文件拖放到 Dock 中的 Symbolicator 图标
  • 在 5-30 秒内,符号化崩溃文件将在与 .crash 和 .xarchive 相同的文件夹中生成
0赞 tanmoy 9/11/2022 #26

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

符号化 iPhone 应用程序崩溃报告的步骤

  • 将苹果提供的崩溃日志格式转换为.txt.crash
  • Xcode > Window > Devices and simulators
  • 必须选择已连接且正在运行的 ios 设备。(不是模拟器或离线设备)
  • 选择部分,拖放文件All Logs.crash

请注意,其他解决方案已被弃用,其用法显示:symbolicatecrash

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