有一天,测试同学给了我一个未经符号化的崩溃日志。如果是以前,我会找到打这个测试包的同事,让他将奔溃日志符号化后发给我。但是这次,我老板傲娇的拒绝了,而是让我自己来做符号化的工作>.<
工具和必要文件 上网查了查,我选择了symbolicatecrash工具来符号化这个崩溃日志。这是Xcode自带的一个perl脚本。
另外,我还需要崩溃日志(测试同学给了我一个.plist文件),测试包对应的.dSYM文件和测试包对应的.app文件。
使用symbolicatecrash 在Xcode6.0之后,这个脚本位于
代码语言:javascript复制Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash
从它开头的注释中,可以了解到,它会利用Spotlight,通过UUID来搜索需要的.dSYM文件,然后找到对应的可执行文件,然后搜索SDK目录。
所以我们可以这样把崩溃日志、.dSYM文件和.app文件放到某个目录下,先在命令行中运行:
代码语言:javascript复制export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
然后运行symbolicatecrash,比如这样:
代码语言:javascript复制/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash ~/myCrash/myCrash.plist > ~/myCrash/myCrash.log
就能在得到符号化之后的崩溃日志了。
System framework的符号化
当我按照上面的步骤运行了symbolicatecrash之后,我发现得到的符号化之后的崩溃日志中,只有应用本身被符号化了,UIKit等system framework却没能被符号化。 可能就是这样(图是stackoverflow上截的):
只有一部分被符号化了的崩溃日志
然而网上的教程都没有提到这种情况(╥﹏╥)
那让我来想想这是为什么吧。
如果要让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的设备,连接到电脑,果然出现了一个新的文件夹。
出现了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文件:
代码语言:javascript复制mdfind "com_apple_xcode_dsym_uuids == xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"