有一天绍妨,測試同學給了我一個未經(jīng)符號化的崩潰日志。如果是以前漠魏,我會找到打這個測試包的同事倔矾,讓他將奔潰日志符號化后發(fā)給我。但是這次柱锹,我老板傲嬌的拒絕了哪自,而是讓我自己來做符號化的工作>.<
工具和必要文件
上網(wǎng)查了查,我選擇了symbolicatecrash工具來符號化這個崩潰日志禁熏。這是Xcode自帶的一個perl腳本壤巷。
另外,我還需要崩潰日志(測試同學給了我一個.plist文件)瞧毙,測試包對應的.dSYM文件和測試包對應的.app文件胧华。
使用symbolicatecrash
在Xcode6.0之后寄症,這個腳本位于
Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash
從它開頭的注釋中,可以了解到矩动,它會利用Spotlight有巧,通過UUID來搜索需要的.dSYM文件,然后找到對應的可執(zhí)行文件悲没,然后搜索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之后栈戳,我發(fā)現(xiàn)得到的符號化之后的崩潰日志中岂傲,只有應用本身被符號化了,UIKit等system framework卻沒能被符號化荧琼。
可能就是這樣(圖是stackoverflow上截的):
然而網(wǎng)上的教程都沒有提到這種情況(╥﹏╥)
那讓我來想想這是為什么吧譬胎。
如果要讓system framework被符號化差牛,那么一定有相關的符號文件存在我電腦的某個地方命锄。它一定會與iOS的版本有關,因為iOS的每次升級偏化,肯定都會有不同的system framework的符號文件脐恩。
查了一下,果然侦讨,在~/Library/Developer/Xcode/iOS DeviceSupport/
中能看到以iOS版本號命名的一些文件夾驶冒。而我需要符號化的崩潰日志,發(fā)生在運行著iOS7.0.6的設備上韵卤。而我電腦中骗污,這個文件夾里面卻沒有iOS7.0.6的文件夾。
想起每當我第一次將某個iOS設備連接到電腦上時沈条,Xcode都會loading一段時間需忿,才能使用這個設備。在loading的階段蜡歹,依稀記得Xcode上的提示是“copying symbols”之類的屋厘。于是我想,我電腦中的system framework的符號文件月而,應該就是這樣來的汗洒。
所以找測試同學借了發(fā)生這個crash的設備,連接到電腦父款,果然出現(xiàn)了一個新的文件夾溢谤。
而當Xcode的loading結(jié)束后瞻凤,再次運行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"