如何用符号表示崩溃日志?


188

Xcode 5组织者有一个视图,其中将列出所有崩溃日志。我们可以在此处拖放坠毁日志。但是从Xcode 6开始,我知道他们已经将设备移出了组织范围,并为它们设置了新窗口。但是我没有找到可以查看崩溃日志的地方,该崩溃日志是在升级到Xcode 6之后在Xcode 5中拖放的。有人知道答案吗?


3
我几个月前在Apple开发人员论坛上问过,但从未得到答案。这是有用功能的损失。向Apple提交错误报告,要求恢复该功能。
rmaddy14 2013年

1
我在一个周末将它们敲在一起,以解决iOS和OSX故障转储的象征。它仍然很粗糙,但是应该可以。github.com/agentsim/Symbolicator
Tim

4
Xcode,能否请您像您应该的那样,从苹果评论家那里获取象征性的崩溃日志...,而不是假设我们从头到尾都想出办法来做到这一点?
William Entriken

Answers:


119

好的,我意识到您可以执行以下操作:

  1. Xcode > Window > Devices,选择左上方已连接的iPhone / iPad / etc。
  2. 查看设备日志
  3. 所有日志

您可能在那里有很多日志,并且为了便于以后查找导入的日志,您可以直接删除所有日志...除非它们对您来说意味着金钱。或者,除非您知道崩溃发生的确切时间点-无论如何应该将其写入文件...我很懒,所以我只删除了所有旧日志(这实际上花了一段时间)。

  1. 只需将文件拖放到该列表中即可。它为我工作。

13
我遇到了同样的问题,但是这并不能为我解决问题-我将其拖放到窗口中的日志出现了,但没有符号化。
Arkaaito 2014年

9
诀窍是您必须连接设备并从列表中选择设备。我认为没有设备是不可能的。
乔尼2014年

59
为了使您的崩溃文件可拖动到该列表中,其扩展名为.crash
pjay_

7
对我来说,缺少的步骤是文件被删除后,我需要右键单击文件并重新符号化日志
RobCroll 2014年

6
不要忘记在管理器中为该存档“下载dSYM”。
123FLO321 '11

259

为社区以及为我自己写这个答案。

如果遇到表示崩溃报告的问题,可以按以下方法解决:

  1. 创建一个单独的文件夹,并将Foo.appFoo.app.dSYM从对应.xcarchive的文件夹复制到该文件夹​​中。还将.crash报告复制到文件夹中。

  2. 在TextEdit或其他地方打开崩溃报告,转到该Binary Images:部分,然后在其中复制第一个地址(例如0xd7000)。

  3. cd进入文件夹。现在,您可以运行以下命令:

    xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 0x0033f9bb

这将在地址处象征符号 0x0033f9bb。请确保为该-arch选项选择正确的值(可以从本Binary Images:节的第一行摘录,也可以从Hardware Model:崩溃报告和应用程序支持的拱门中找出)。

您还可以将崩溃报告中的必要地址(例如,线程调用堆栈)直接复制到文本文件中(在TextEdit中,按住Option并选择必要的文本块,或复制并剪切),以得到如下信息:

0x000f12fb
0x002726b7
0x0026d415
0x001f933b
0x001f86d3

现在您可以将其保存到文本文件中,例如 addr.txt,然后运行以下命令:

xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 -f addr.txt

这将立即为所有地址提供一个很好的符号。

聚苯乙烯

在进行上述操作之前,值得检查一下所有设置是否正确(如 atos高兴会为您提供的任何基本地址报告一些内容)。

要进行检查,请打开崩溃报告,然后转到的调用堆栈的末尾Thread 0。从第一行开始列出您的应用程序(通常是第二行),例如:

34  Foo                    0x0033f9bb 0xd7000 + 2525627

应该是main()电话。0x0033f9bb如上所述标记地址(在这种情况下)应确认该地址确实是main()而不是某些随机方法或功能。

如果地址不是的main(),请检查您的加载地址(-l选件)和拱形(-arch选件)。

PPS

如果由于位导致上述方法不起作用,请从iTunes Connect下载用于构建的dSYM,从dSYM中提取可执行二进制文件(“ Finder”>“ Show Package Contents”),将其复制到目录中,然后将其Foo用作目录。论证atos而非Foo.app/Foo


2
感谢您编写mini xcrun教程并使用健全性检查部分进行更新的麻烦。经过大量的宣誓并没有任何象征意义,我的理智得到了拯救
Anton Tropashko 2014年

10
不要忘记验证崩溃报告是否与可执行文件和dSYM相匹配。您可以通过该标识符匹配检查这个<>下与通过运行可执行文件返回二值图像部分的xcrun dwarfdump --uuid <path to executable>
莱恩C.佩恩

2
请注意,只有来自应用程序(Foo)的符号才会显示。它不会显示来自外部库/框架(例如Foundation或libsystem_kernel.dylib)的符号。
jlukanta 2015年

1
这是有帮助的,但仍然对我不起作用。我遇到问题的部分是我没有0xd7000信息。我的行看起来像这样0x100038328 __mh_execute_header +99112。我已经读过__mh_execute_header是什么,但是我如何获得有关0x100038328的信息?我还有其他一切
skinsfan00atg 2015年

5
我编写了一个简单的bash脚本,可以为您完成大部分工作。用法:./symbolicate.sh mycrash.crash MyApp.app arch64 output.crash 只有它会符号化完整的崩溃报告,并为您提供符号化版本。 gist.github.com/nathan-fiscaletti/...
弥敦道F.

186

您也可以参考这一步,我已经编写了“ 手动崩溃重新符号化”的分步过程

崩溃重新符号化

第1步

将上述所有文件(MyApp.app,MyApp-dSYM.dSYM和MyApp-Crash-log.crash)移动到具有方便名称的文件夹中,无论您在何处可以轻松地使用Terminal。

对我来说,桌面是最容易到达的地方;)因此,我将这三个文件移到了桌面的MyApp文件夹中。

第2步

现在轮到Finder了,从适用于您的XCODE版本的任何一个开始的路径。

使用此命令查找symbolicatecrash脚本文件,
find /Applications/Xcode.app -name symbolicatecrash

Xcode 8,Xcode 9,Xcode 11 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

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

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

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

降低Xcode 6 Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

要么 Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources

步骤3

将找到的symbolicatecrash脚本文件的目录添加到$PATHenv变量中,如下所示:sudo vim /etc/paths.d/Xcode-symbolicatecrash并粘贴脚本文件的目录并保存该文件。当打开一个新终端时,您可以symbolicatecrash在任何文件夹中以命令的形式调用/usr/bin

要么

从此位置复制symbolicatecrash文件,然后将其粘贴到Desktop / MyApp(请等一下。不要盲目跟着我,我将sybolicatecrash文件粘贴到MyApp文件夹中,该文件夹是您在第一步中创建的,位于您喜欢的位置,具有三个文件。 )

第4步

打开终端,并CD到MyApp文件夹。

cd Desktop/MyApp — Press Enter
export DEVELOPER_DIR=$(xcode-select --print-path)

 —  按Enter

./symbolicatecrash -v MyApp-Crash-log.crash MyApp.dSYM

 —  按Enter

而已 !!符号日志在您的终端上……现在您还在等什么呢?现在简单地,找出错误并解决它;)

快乐编码!


2
@EmilVikström:感谢您的建议,已经更新了答案。
Mrug 2015年

2
使用export DEVELOPER_DIR =xcode-select --print-path
Parag Bafna 2015年

8
工作了请客-谢谢。我只需要使用export DEVELOPER_DIR = / Applications / XCode.app / Contents / Developer(不带引号)就可以了。
goelectric

1
“ export DEVELOPER_DIR = xcode-select --print-path”只是告诉我“ -bash:export:`--print-path':不是有效的标识符
Almo

2
更新 这里是 ; 对于xcode7,请在此处找到symbolicatecrash;/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash每stackoverflow.com/questions / 32804611 /…
AnneTheAgile 2016年

27

对我来说.crash文件就足够了。没有.dSYM文件和.app文件。

我在构建归档文件的Mac上运行了这两个命令,它起作用了:

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" 

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash  /yourPath/crash1.crash > /yourPath/crash1_symbolicated.crash

哇。如果不使用.dsym文件,我不知道它如何工作,但它可以工作!
rustyMagnet 18/09/20

4
@rustyMagnet的工作方式是通过使用计算机上已归档版本中的dsyms。
安德烈·塔兰佐夫

1
是的,这仅适用于您使用Xcode归档的版本,不适用于您可能想要为崩溃日志符号化的临时运行生成的任何其他版本。
-CMash

21

有一种使用Xcode的简便方法(无需使用命令行工具,一次只查找一个地址)

  1. 取得任何.xcarchive文件。如果您之前有一个,可以使用它。如果您没有,请通过从Xcode运行产品>存档来创建一个。

  2. 右键单击.xcarchive文件,然后选择“显示软件包内容”

  3. 将dsym文件(已崩溃的应用程序的版本)复制到dSYMs文件夹

  4. 将.app文件(已崩溃的应用程序的版本)复制到“产品”>“应用程序”文件夹中

  5. 编辑Info.plist并编辑ApplicationProperties词典下的CFBundleShortVersionString和CFBundleVersion。这将帮助您以后识别存档

  6. 双击.xcarchive,将其导入Xcode。它应该打开管理器。

  7. 返回崩溃日志(在Xcode的“设备”窗口中)

  8. 将您的.crash文件拖到那里(如果尚不存在)

  9. 整个崩溃日志现在都应该用符号表示。如果不是,请右键单击并选择“重新符号化崩溃日志”


1
您的答案是正确而简单的。无需使用终端应用程序。重新创建.xcarchive文件夹非常重要,因为在某些Continuous-Integration系统中没有.xcarchive文件,而不是.app.dSYM文件夹的zip球。碰巧的是,我昨天所做的与您所说的完全相同。
DawnSong

完整的输出应该是什么样?
noobsmcgoobs 2016-4-19的

尽管我确实跳过了第3-5步,但这部分地表示了我的崩溃日志,因为我的xcarchive是针对崩溃应用程序的版本的。
Declan McKenna

1
当然,它只会象征您自己的代码,而不是您可能已在使用的外部库代码。
RPM

7

请按照Xcode 10中的以下步骤来表示来自同一计算机上的应用程序构建的崩溃日志:

  1. Organizer内部,找到应用程序所基于的存档。
  2. 单击下载调试符号按钮。什么都不会出现在“下载”文件夹中,但是可以。
  3. 将构建计算机连接到iOS设备。
  4. 设备和模拟器中选择设备
  5. 单击查看设备日志按钮。
  6. 将崩溃文件拖放到左侧面板。该文件必须以.crash结尾扩展名,否则拖动将失败。
  7. 切换到“ 所有日志”选项卡。
  8. 选择添加的崩溃文件。
  9. 该文件应自动进行符号化,否则请使用右键单击上下文菜单项“ 重新符号化日志”

1
起初我不认为这会给其他帖子增加任何东西,但是前两个步骤,特别是“下载调试符号”,似乎是我所缺少的。谢谢。
克里斯托弗·金

6

如果在同一子文件夹中有.dSYM和.crash文件,则可以执行以下步骤:

  1. 查看.crash文件中的回溯,在第二列中注意二进制映像的名称,在第三列中注意地址(例如,在下面的示例中为0x00000001000effdc)。
  2. 在回溯的正下方,在“二进制图像”部分中,请注意二进制图像(例如TheElements)的图像名称,体系结构(例如arm64)和加载地址(在下面的示例中为0x1000e4000)。
  3. 执行以下命令:

$ atos -arch arm64 -o TheElements.app.dSYM/Contents/Resources/DWARF/TheElements -l 0x1000e4000 0x00000001000effdc -[AtomicElementViewController myTransitionDidStop:finished:context:]

权威来源: https //developer.apple.com/library/content/technotes/tn2151/_index.html#//apple_ref/doc/uid/DTS40008184-CH1-SYMBOLICATE_WITH_ATOS


3

确保您的Xcode应用程序名称不包含任何空格。这就是它对我不起作用的原因。因此/Applications/Xcode.app有效,但/Applications/Xcode 6.1.1.app不起作用。


你有没有尝试过?如果不是,请尝试查看您的评论是否有意义。
Bouke

1
这与我所说的不是同一问题。Xcode可以在安装后但在首次使用之前重命名。但是,用于符号化的脚本无法处理应用程序名称中的空格,并且将失败。
Bouke 2015年

1
@ChuckKrutsinger您是否真的尝试过?因为转义的空格将允许您运行脚本,但是脚本本身将失败。该脚本可能不会用转义空间调用其他脚本。
布克

1
@ChuckKrutsinger太好了,但如果要Xcode自动表示崩溃日志的话,最后您需要我的回答。
Bouke

1
我想重申一下bouke是正确的,并且如果Xcode应用程序的路径中有空格,则Xcode用于重新符号化崩溃日志的脚本将不起作用。与手动重新符号化无关。
加里·马金

3

Xcode 11.2.1,2019年12月

Apple为您提供.txt格式的崩溃日志,该日志没有符号化

**

连接设备

**

  • 下载“ .txt”文件,将扩展名更改为“ .crash” 在此处输入图片说明
    • 从Xcode的窗口选项卡中打开设备和模拟器
    • 选择设备并选择设备日志
    • 将.crash文件拖放到设备日志窗口中

在此处输入图片说明

我们将能够在那看到符号化的崩溃日志

请参阅链接以获取更多有关符号崩溃日志的详细信息


2

从苹果的文档:

使用Xcode象征崩溃报告Xcode会自动尝试象征它遇到的所有崩溃报告。您需要做的符号化工作就是将崩溃报告添加到Xcode Organizer。

  • 将iOS设备连接到Mac
  • 从“窗口”菜单中选择“设备”
  • 在左列的“设备”部分下,选择一个设备
  • 单击右侧面板“设备信息”部分下的“查看设备日志”按钮。
  • 将您的崩溃报告拖到显示面板的左列
  • Xcode将自动符号化崩溃报告并显示结果要符号化崩溃报告,Xcode需要能够找到以下内容:

    1. 崩溃的应用程序的二进制文件和dSYM文件。

    2. 应用程序链接到的所有自定义框架的二进制文件和dSYM文件。对于使用应用程序从源构建的框架,将其dSYM文件与应用程序的dSYM文件一起复制到存档中。对于由第三方构建的框架,您将需要向作者索要dSYM文件。

    3. 崩溃时正在运行该应用程序的操作系统的符号。这些符号包含特定OS版本(例如iOS 9.3.3)中包含的框架的调试信息。操作系统符号是特定于体系结构的-适用于64位设备的iOS版本不会包含armv7符号。Xcode将自动从您连接到Mac的每个设备中复制OS符号。

如果缺少这些,则Xcode可能无法符号化崩溃报告,或者只能部分符号化崩溃报告。


2

象征崩溃日志的最简单过程:

  1. 在IPA构建过程中保留组织者的xcarchive文件,以备将来使用。
  2. 发生崩溃时,请从受影响的设备收集崩溃日志。扩展名应为.crash。如果崩溃日志为.ips格式,只需将其重命名为.crash。
  3. 双击存储路径中的xcarchive,使其出现在管理器中(如果尚不存在)。
  4. 在xcode窗口中打开->设备和模拟器->查看设备日志->所有日志->拖放.crash文件。

等待5秒。砰! 堆栈跟踪中的应用程序调用将被符号化!您可能仍然会看到很多符号!这些是内部库和框架调用。

这是最简单的,经过尝试和测试!


1

Apple为您提供.txt格式的崩溃日志,该日志没有符号化

**

连接设备

**

  • 下载“ .txt”文件,将扩展名更改为“ .crash” 在此处输入图片说明
    • 从Xcode的窗口选项卡中打开设备和模拟器
    • 选择设备并选择设备日志
    • 将.crash文件拖放到设备日志窗口中

在此处输入图片说明

我们将能够在那看到符号化的崩溃日志

请参阅链接以获取更多有关符号崩溃日志的详细信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.