Xcode 5的组织者(Organizer)有一个视图,可以列出所有崩溃日志,并且我们可以将崩溃日志拖放到此处。但是自从Xcode 6以后,我知道他们已经将设备移出组织者并为其创建了一个新窗口。但是我找不到在升级到Xcode 6后查看我在Xcode 5中拖放的崩溃日志的地方。有人知道答案吗?
Xcode 5的组织者(Organizer)有一个视图,可以列出所有崩溃日志,并且我们可以将崩溃日志拖放到此处。但是自从Xcode 6以后,我知道他们已经将设备移出组织者并为其创建了一个新窗口。但是我找不到在升级到Xcode 6后查看我在Xcode 5中拖放的崩溃日志的地方。有人知道答案吗?
我写这篇答案不仅是为了社区,也是为了自己。
如果在符号定位崩溃报告时遇到问题,可以按以下步骤解决:
创建一个单独的文件夹,将相应的.xcarchive
中的Foo.app
和Foo.app.dSYM
复制到该文件夹中。还要将.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.S.
如果由于比特代码而无法使用上述方法,则从iTunes Connect下载您构建的dSYM,从中提取可执行二进制文件(Finder > Show Package Contents),将其复制到目录中,并使用它(即Foo
)作为参数传递给atos
,而不是Foo.app/Foo
。
./symbolicate.sh mycrash.crash MyApp.app arch64 output.crash
它将符号化完整的崩溃报告,并给您提供符号化版本的内容。https://gist.github.com/nathan-fiscaletti/b58b642f78a4f60274e3be703e230140 - Nathan F.你也可以参考这个链接,我写了一步一步的手动崩溃重新符号化过程。
第一步
将上述所有文件(MyApp.app、MyApp-dSYM.dSYM和MyApp-Crash-log.crash)移动到一个方便使用终端的文件夹中。
对我来说,桌面是最容易到达的地方;) 因此,我已将这三个文件移动到桌面上的名为MyApp的文件夹中。
第二步
现在轮到Finder了,根据您的XCODE版本选择以下路径之一。
使用此命令查找symbolicatecrash
脚本文件,
find /Applications/Xcode.app -name symbolicatecrash
Xcode 7.3及更高版本(Xcode 8、...、Xcode 14、...):/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
第三步
像这样将找到的symbolicatecrash脚本文件目录添加到$PATH
env变量中:sudo vim /etc/paths.d/Xcode-symbolicatecrash
,并粘贴脚本文件目录并保存该文件。在打开新终端时,您可以在任何文件夹中调用symbolicatecrash
作为位于/usr/bin
中的命令。
或者
从这个位置复制symbolicatecrash文件,并将其粘贴到Desktop/MyApp。 (等一下...不要盲目跟随我,在步骤一中创建的文件夹MyApp中粘贴sybolicatecrash文件,这是您喜欢的位置,包含三个文件。)
第四步
打开终端,并CD到MyApp文件夹。
cd Desktop/MyApp — Press Enter
export DEVELOPER_DIR=$(xcode-select --print-path)
— 按下回车键
./symbolicatecrash -v MyApp-Crash-log.crash MyApp.dSYM
完成了!符号化的日志已经在你的终端上了… 现在只需找到错误并解决它 ;)
export DEVELOPER_DIR=`xcode-select --print-path`
- Parag Bafna./symbolicatecrash -v MyApp-Crash-log.crash MyApp.dSYM | xargs >> symbolicated_crash_log
这将把符号化的日志写入指定的文件中。 - geekay我意识到你可以这样做:
您可能有很多日志,在后面找到导入的日志更容易一些,您可以立即删除所有日志…除非它们对您意味着钱。或者,除非您知道崩溃发生的确切时间点-它应该在文件中写好了...我很懒,所以我只删除所有旧日志(这实际上花了一些时间)。
3a. 确保日志文件具有扩展名.crash
(而不是.txt
或.ips
)
.crash
。 - pjay_对我来说,.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
有一个更简单的方法使用Xcode来做(不用使用命令行工具和一个接着一个查找地址)
选取任何一个.xcarchive文件。如果之前有一个,可以直接使用。如果没有,可以通过在Xcode中运行“Product > Archive”来创建一个。
右键点击.xcarchive文件,然后选择“显示包内容”。
将崩溃版本的dsym文件复制到dSYMs文件夹中。
将崩溃版本的.app文件复制到Products > Applications文件夹中。
编辑Info.plist文件,编辑ApplicationProperties字典下的CFBundleShortVersionString和CFBundleVersion。这将帮助您后来识别档案。
双击.xcarchive文件将其导入到Xcode中。它会打开Organizer。
返回到崩溃日志(在Xcode的设备窗口中)中。
将.crash文件拖到那里(如果还没有出现)。
整个崩溃日志现在应该已经被符号化了。如果没有,请右键点击并选择“重新符号化崩溃日志”。
.xcarchive
文件,然后Xcode就会加载它。不需要步骤2-6,但是这个答案已经有六年了,所以可能会有改进。一旦我加载了存档,Xcode就开始无问题地对我的崩溃日志进行符号化处理。 - BillXcode 11.2.1,2019年12月
苹果以 .txt 格式提供了崩溃日志,但该格式是未进行符号化处理的
**
连接设备后:
**
我们将能够在那里看到符号化的崩溃日志
请参阅链接以获取有关符号化崩溃日志的详细信息Crash logs
你需要获取包含DWARF文件的.dSYM文件夹,并使用编辑器打开.crash文件。
查看回溯(backtrace)部分,你应该会看到类似下面的内容:
...
13 TheElements 0x0000000100f62ca0 0x100f5c000 + 27808
14 UIKitCore 0x00000001843e3044 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 356 (UIApplication.m:2328)
...
Binary Images:
0x100f5c000 - 0x101673fff TheElements arm64 ...
...
0x0000000100f62ca0
)0x100f5c000
)Binary Images
部分中的架构 (arm64
)$ atos -arch <arch> -o TheElements.app.dSYM/Contents/Resources/DWARF/TheElements -l <short_address> <long_address>
你应该得到这样的结果:
-[AtomicElementViewController myTransitionDidStop:finished:context:]
注意:如果由于任何原因您无法访问.dSYM文件,则可以使用Xcode>Product>Archive重新创建.xcarchive,但请确保构建的是完全相同的代码。然后,您可以从.xcarchive包中提取符号。
按照以下步骤在Xcode 10中对来自同一台机器构建的应用程序崩溃日志进行符号化:
/Applications/Xcode.app
是可以工作的,而 /Applications/Xcode 6.1.1.app
不行。/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash
。 - Bouke根据苹果的文档:
使用Xcode对崩溃报告进行符号化 Xcode将自动尝试对遇到的所有崩溃报告进行符号化。您只需要将崩溃报告添加到Xcode组织者中即可进行符号化。
Xcode将自动对崩溃报告进行符号化并显示结果 要对崩溃报告进行符号化,Xcode需要能够定位以下内容:
崩溃应用程序的二进制文件和dSYM文件。
应用程序链接的所有自定义框架的二进制文件和dSYM文件。对于与应用程序一起构建的框架,它们的dSYM文件将复制到归档中,与应用程序的dSYM文件一起。对于由第三方构建的框架,您需要向作者请求dSYM文件。
应用程序在崩溃时运行的操作系统的符号。这些符号包含特定OS版本(例如iOS 9.3.3)中包含的框架的调试信息。OS符号是体系结构特定的-64位设备上的iOS版本不会包括armv7符号。Xcode将自动从连接到Mac的每个设备复制OS符号。
如果缺少其中任何一个,Xcode可能无法对崩溃报告进行符号化,或者可能只能部分符号化崩溃报告。