Xcode 5组织者有一个列出所有崩溃日志的视图。我们可以在这里拖放崩溃日志。但是从Xcode 6开始,我知道他们已经将设备从组织中移出,并为此设置了一个新窗口。但是我没有找到一个地方,我在查看Xcode 5后,在Xcode 5中拖放了崩溃日志。有人知道答案吗?
答案 0 :(得分:230)
尽可能为社区写这个答案。
如果在表示崩溃报告时遇到问题,可以按如下方式克服这些问题:
创建一个单独的文件夹,将Foo.app
和Foo.app.dSYM
从相应的.xcarchive
复制到该文件夹中。同时将.crash
报告复制到文件夹中。
在TextEdit或其他地方打开崩溃报告,转到Binary Images:
部分,然后复制其中的第一个地址(例如0xd7000
)。
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
这将立即为所有地址提供一个很好的符号。
<强> P.S。强>
在执行上述操作之前,值得检查一切是否正确设置(因为atos
会很乐意为基本上任何提供的地址报告一些内容。)
要进行检查,请打开崩溃报告,然后转到Thread 0
的调用堆栈的末尾。从结尾开始列出你的应用程序的第一行(通常是第二行),例如:
34 Foo 0x0033f9bb 0xd7000 + 2525627
应该是main()
来电。如上所述,对地址进行符号化(在这种情况下为0x0033f9bb
)应该确认这确实是main()
而不是一些随机方法或函数。
如果地址不是main()
的地址,请检查加载地址(-l
选项)和拱门(-arch
选项)。
<强> P.P.S。强>
如果上述因 bitcode 而无效,请从iTunes Connect下载构建版本的dSYM,从dSYM(Finder&gt; Show Package Contents)中提取可执行二进制文件,将其复制到目录,并使用它(即Foo
)作为atos
的参数,而不是Foo.app/Foo
。
答案 1 :(得分:149)
您也可以参考这个,我已经逐步编写了手动崩溃重新符号化的程序。
第1步
将所有上述文件(MyApp.app,MyApp-dSYM.dSYM和MyApp-Crash-log.crash)移动到一个方便名称的文件夹中,方便您轻松使用终端。
对我来说,桌面是最容易到达的地方;) 因此,我已将这三个文件移动到桌面上的MyApp文件夹中。
第2步
现在轮到Finder,转到以下适用于您的XCODE版本的路径。
使用此命令查找symbolicatecrash
脚本文件,
find /Applications/Xcode.app -name symbolicatecrash
Xcode 8,Xcode 9 /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脚本文件的目录添加到$PATH
env变量中,如下所示:sudo vim /etc/paths.d/Xcode-symbolicatecrash
并粘贴脚本文件的目录并保存文件。打开新终端时,您可以在任意文件夹中调用symbolicatecrash
作为/usr/bin
中的命令。
或者
从此位置复制symbolicatecrash文件,并将其粘贴到Desktop / MyApp (等等......不要盲目跟我,我在MyApp文件夹中粘贴sybolicatecrash文件,你在最喜欢的位置在第一步创建的文件,有三个文件。)
第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 :(得分:100)
好的,我意识到你可以这样做:
Xcode > Window > Devices
中,选择左上角连接的iPhone / iPad /等。您可能在那里有很多日志,并且为了以后更容易找到导入的日志,您可以在此时继续删除所有日志...除非它们对您有意义。或者除非你知道崩溃发生的确切时间点 - 它应该写在文件中...我很懒,所以我只删除所有旧日志(这实际上需要一段时间)。
答案 3 :(得分:19)
使用Xcode有一种更简单的方法(不使用命令行工具并一次查找一个地址)
获取任何.xcarchive文件。如果你有一个之前你可以使用它。如果您没有,请通过运行产品&gt;创建一个。从Xcode存档。
右键单击.xcarchive文件,然后选择“显示包内容&#39;
将dsym文件(崩溃的应用程序版本)复制到dSYMs文件夹
将.app文件(崩溃的应用程序版本)复制到Products&gt;应用程序文件夹
编辑Info.plist并编辑ApplicationProperties字典下的CFBundleShortVersionString和CFBundleVersion。这有助于您稍后识别存档
双击.xcarchive将其导入Xcode。它应该打开管理器。
返回崩溃日志(在Xcode的“设备”窗口中)
将.crash文件拖放到那里(如果尚未存在)
现在应该对整个崩溃日志进行符号化。如果没有,请右键单击并选择“重新符号化崩溃日志”
答案 4 :(得分:12)
对我来说.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
答案 5 :(得分:5)
按照Xcode 10中的这些步骤来表示来自同一台计算机上构建的应用程序的崩溃日志:
答案 6 :(得分:4)
确保您的Xcode应用程序名称不包含任何空格。这就是它不适合我的原因。因此/Applications/Xcode.app
有效,而/Applications/Xcode 6.1.1.app
无效。
答案 7 :(得分:3)
如果.dSYM和.crash文件位于同一子文件夹中,则可以采取以下步骤:
$ atos -arch arm64 -o TheElements.app.dSYM/Contents/Resources/DWARF/TheElements -l 0x1000e4000 0x00000001000effdc
-[AtomicElementViewController myTransitionDidStop:finished:context:]
答案 8 :(得分:2)
来自Apple的文档:
用Xcode表示崩溃报告 Xcode将自动尝试对其遇到的所有崩溃报告进行符号化。您需要为符号化做的只是将崩溃报告添加到Xcode Organizer。
Xcode会自动对崩溃报告进行符号化并显示结果 为了表示崩溃报告,Xcode需要能够找到以下内容:
崩溃的应用程序的二进制文件和dSYM文件。
应用程序链接的所有自定义框架的二进制文件和dSYM文件。对于使用应用程序从源代码构建的框架,他们的dSYM文件将与应用程序的dSYM文件一起复制到存档中。对于由第三方构建的框架,您需要向作者询问dSYM文件。
崩溃时该应用程序运行的操作系统的符号。这些符号包含特定OS版本(例如,iOS 9.3.3)中包含的框架的调试信息。 OS符号是特定于体系结构的 - 用于64位设备的iOS版本不包含armv7符号。 Xcode将自动从连接到Mac的每个设备复制OS符号。
如果缺少其中任何一个,Xcode可能无法表示崩溃报告,或者可能只是部分地表示崩溃报告。
答案 9 :(得分:1)
最简单的象征崩溃日志的过程:
等待5秒钟。砰!堆栈跟踪中的应用程序调用将被符号化! 您可能仍然会看到很多符号!这些是内部库和框架调用。
这是最简单的方法,经过尝试和测试!
答案 10 :(得分:1)
答案 11 :(得分:0)
Xcode 11.2.1,2019年12月
Apple为您提供了.txt格式的崩溃日志,该符号没有符号化
**
已连接设备
**
我们将能够在那看到符号化的崩溃日志
有关符号化Crash logs
的更多信息,请参见链接。答案 12 :(得分:0)