使用symbolicatecrash解析了一个crash log

有一天,测试同学给了我一个未经符号化的崩溃日志。如果是以前,我会找到打这个测试包的同事,让他将奔溃日志符号化后发给我。但是这次,我老板傲娇的拒绝了,而是让我自己来做符号化的工作>.<


工具和必要文件



上网查了查,我选择了symbolicatecrash工具来符号化这个崩溃日志。这是Xcode自带的一个perl脚本。

另外,我还需要崩溃日志(测试同学给了我一个.plist文件),测试包对应的.dSYM文件和测试包对应的.app文件。


使用symbolicatecrash



在Xcode6.0之后,这个脚本位于

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

从它开头的注释中,可以了解到,它会利用Spotlight,通过UUID来搜索需要的.dSYM文件,然后找到对应的可执行文件,然后搜索SDK目录。

所以我们可以这样把崩溃日志、.dSYM文件和.app文件放到某个目录下,先在命令行中运行:

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

然后运行symbolicatecrash,比如这样:

/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash   ~/myCrash/myCrash.plist  > ~/myCrash/myCrash.log

就能在得到符号化之后的崩溃日志了。


System framework的符号化



当我按照上面的步骤运行了symbolicatecrash之后,我发现得到的符号化之后的崩溃日志中,只有应用本身被符号化了,UIKit等system framework却没能被符号化。
可能就是这样(图是stackoverflow上截的):

使用symbolicatecrash解析了一个crash log_第1张图片
只有一部分被符号化了的崩溃日志

然而网上的教程都没有提到这种情况(╥﹏╥)

那让我来想想这是为什么吧。

如果要让system framework被符号化,那么一定有相关的符号文件存在我电脑的某个地方。它一定会与iOS的版本有关,因为iOS的每次升级,肯定都会有不同的system framework的符号文件。
查了一下,果然,在~/Library/Developer/Xcode/iOS DeviceSupport/中能看到以iOS版本号命名的一些文件夹。而我需要符号化的崩溃日志,发生在运行着iOS7.0.6的设备上。而我电脑中,这个文件夹里面却没有iOS7.0.6的文件夹。
想起每当我第一次将某个iOS设备连接到电脑上时,Xcode都会loading一段时间,才能使用这个设备。在loading的阶段,依稀记得Xcode上的提示是“copying symbols”之类的。于是我想,我电脑中的system framework的符号文件,应该就是这样来的。

所以找测试同学借了发生这个crash的设备,连接到电脑,果然出现了一个新的文件夹。


使用symbolicatecrash解析了一个crash log_第2张图片
出现了7.0.6文件夹

而当Xcode的loading结束后,再次运行symbolicatecrash,就得到了完整的符号化之后的崩溃日志。


参考

分析iOS Crash文件:符号化iOS Crash文件的3种方法
symbolicatecrash with XCode 4.2 not symbolicating system symbols


2016.01.24更新



可以用这个命令在电脑里找到某个uuid对应的dSYM文件:

mdfind "com_apple_xcode_dsym_uuids == xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

你可能感兴趣的:(使用symbolicatecrash解析了一个crash log)