symbolicatecrash 是 Xcode 自带的 crash 日志分析工具,我们可以通过下列命令找到它:
find /Applications/Xcode.app -name symbolicatecrash -type f
执行完后,会返回几个路径,我们用:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
什么是UUID?
每一个可执行程序都有一个build UUID来唯一标识。Crash日志包含发生crash的这个应用的build UUID。
如何获得crash的UUID?
执行命令:
grep --after-context=2 "Binary Images:" *crash
结果:
appName.crash:Binary Images:
appName.crash-0x104bb0000 - 0x10796bfff appName arm64 <084d35c2e0ec33179e85e6ca386fbcef> /var/containers/Bundle/Application/0839BD73-3BE0-4408-B975-42A027EE33B0/appName.app/appName
appName.crash-0x109288000 - 0x1092c3fff dyld arm64 <b15e536a710732dabfafece44c5685e4> /usr/lib/dyld
上面的084d35c2e0ec33179e85e6ca386fbcef就是crash的UUID。
如何获得.dSYM的UUID?
执行命令:
dwarfdump --uuid appName.app.dSYM
结果:
UUID: 8ACA24B6-CAA0-37AC-A1DA-60762227A5CA (armv7) appName.app.dSYM/Contents/Resources/DWARF/appName
UUID: 084D35C2-E0EC-3317-9E85-E6CA386FBCEF (arm64) appName.app.dSYM/Contents/Resources/DWARF/appName
如何获得.app的UUID?
执行命令:
dwarfdump --uuid appName.app/appName
结果:
UUID: 8ACA24B6-CAA0-37AC-A1DA-60762227A5CA (armv7) appName.app/appName
UUID: 084D35C2-E0EC-3317-9E85-E6CA386FBCEF (arm64) appName.app/appName
由上可以看出:这3个文件的UUID是相同的,也就是匹配的,因此可以正确解析。
开始解析
在解析之前,需要将".app",".dSYM",".crash"文件放在同一个目录下。打开终端,进入当前目录,输入如下命令:
export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
然后输入:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash appName.crash appName.app > appName.log
现在,符号化的crash log就保存在appName.log中了。