Determining Whether a Crash Report is Symbolicated
(决定是否符号化崩溃日志)
一个崩溃日志可能是没有符号化的,没有符号化的日志将不包括方法或者和方法名在回溯信息汇总。然而,你二进制映像在可执行的16进制的地址中。在一个被完全符号化的日志中,每一行16进制地址都是对应着符号。在部分符号化的崩溃日志中,只有一些地址在回溯日志中被替换在它的回馈符号中。很明显,你应该尝试符号化获得的崩溃日志当它提供了很多内在的崩溃。一部分符号化奔溃日志可能包括足够的饿信息去明白奔溃,依赖崩溃的类型和回溯的一部分(被成功符号化的一部分)。没有符号化的崩溃日志很少有用。
Symbolicating Crash Reports With Xcode (使用xcode进行符号化)
xcode 会自动尝试符号化崩溃日志,需要的所有的用于符号化从organizer中。
要符号化这些崩溃日志,需要本地化一下步骤;
(1)应用的二进制文件和dsym文件
(2)二进制和dsym文件对于所有的库(应用所以来的),这些库用于从应用的源码中建立,他们的dsym文件用于拷贝进入归档依赖dsym文件。对于第三方库,我们需要问作者要dsym文件。
(3)os的符号对于应用运行当崩溃的时候,这些符号包括调试信息对于库包括os的分布。os符号是指定结构的,一个指定64位的设备不包括armv7 符号。xcode 将自动拷贝os符号从每一个设备(你连接到你的mac上的设备)
Symbolicating Crash Reports With atos(使用atos进行符号化)
atos -- 将数字化的地址转化为二进制符号或者进程;
如果一个调试的符号信息是有用的,atos的输出将会包括文件的名字和资源的行号信息。atos 命令能够用于符号化单独的地址在没有被符号化的回溯信息中或者部分符号化、崩溃日志。去符号化一部分崩溃日志使用atos。
1) 找一行回溯信息中的你想符号化的,注意二进制映像的名字在第二列和第三列的地址
2)查找二进制映像的名字在崩溃日志的二进制映像汇总。注意结构和加载的二进制地址。
Figure 4 Information from the crash report that is needed to use atos.
1)定位对于二进制文件的dsym。你可以使spotlight 去查找匹配dsym文件和UUID的二进制对应。查看Symbolication Troubleshooting 节。
dsym文件被绑定,该dsym文件属于包括DWARF调试信息通过编译产生的在建立的时间。你必须根据提供的路径去这个文件而不是dsym 捆绑束。当调用atos的时候。
2)在上面的信息中你能够符号化地址在回溯信息汇总使用atos命令。你能够指定多个地址去符号化。通过空格来分开。
atos -arch <Binary Architecture> -o <Path to dSYM file>/Contents/Resources/DWARF/<binary image name> -l <load address> <address to symbolicate>
上面的内容例子:
atos -arch arm64 -o TheElements.app.dSYM/Contents/Resources/DWARF/TheElements -l 0x1000e4000 0x00000001000effdc
-[AtomicElementViewController myTransitionDidStop:finished:context:]
Symbolication Troubleshooting(符号化分析解决问题)
如果xcode 符号化崩溃日志失败,可能是mac少了dsym对应的应用而二进制的文件,dsym文件对于一个或者多个库的依赖于一个或者多个应用的连接或者设备的符号对于正在运行的os运用(当它崩溃而时候)。西面步骤展示怎么使用spolight去确定dsym文件是否需要符号化一个回溯地址在你mac上的显示的二进制文件。
Figure 5 Locating the UUID for a binary image. (定位UUID和二进制映像)【通过二进制映像名字】
1)找到回溯信息中的xcoe失败的符号。注意二进制映像文件的名字在第二列
2)查找二进制映像通过名字在崩溃日志的下面的二进制映像列表中。这个列表包括了UUIDs 对于每个二进制映像,它加载到崩溃日志的进程中。
Listing 2 通过grep工具快速找到 (可以的看到对应的二进制映像以及对应的内容是通过名字来找到的)
grep --after-context=1000 "Binary Images:" <Path to Crash Report> | grep <Binary Name>
3)转化二进制映像的UUID 到32个字母字符被(8-4-4-4-12)这样的方式进行组织分开。注意所有的字幕都必须是被转为大写字母。
4)查找UUID通过mdfind 命令工具使用"com_apple_xcode_dsym_uuids == <UUID>
Listing 3 使用mdfind 命令查找dsym文件和给出的UUID。
$ mdfind "com_apple_xcode_dsym_uuids == <UUID>
5)如果spotlight 找dfym文件的UUID,mdfind将会打印出dsym的路劲和可能包括的归档文件。如果一个dsym文件的UUID没有找到,将会推出没有打印任何信息。
如果Spotlight 到一个dsym文件给二进制文件但是xcode 不能够符号化地址对于二进制映像,然后你应该文件上有bug。让崩溃日志和dsym文件连接起来。在周围,你能够手动符号化地址通过atos。看 Symbolicating Crash Reports With ato 这一章。
如果spotlight 没有肇东dsym文件对于二进制映像,确定你仍然有一有xcode的归档文件对于你的应用,你的归档的崩溃日志定位的位置,spotlight能够找到你的目录如果是在home目录下面。如果你的应用使用了bitcode来进行打包,确定你下载的dsym文件对于对后的编译文件来自于app store。下载dsym我呢间。如果你想你有正确的dsym文件(二进制映像),你可以使用dwarfdump 命令答应出匹配的UUID。你可以用dwarfdump 命令打印二进制的UUID。
命令:
xcrun dwarfdump --uuid <Path to dSYM file>
注意: 你必须有归档文件就是你当初提交到app store 上对于你的应用的崩溃,dsym文件和应用的二进制被绑定在一起。创建一个新的归档我呢间,甚至从相同的源代码并且配置,将不会产生dsym我呢间和崩溃的建立关系。
如果你没有这个归档文件,你就需要提交新的一份,进行操作了。