工作中碰到crash是家常便饭,但怎么去分析crash,吃好这顿饭呢,我根据一些资料和自己的实践总结了下。
平时我们拿到的崩溃都是没有符号化的,都是二进制地址,如下图,我们要做的就是把它符号化,找到对应的崩溃代码。
符号化分两种情况,有发生崩溃的设备和没有设备的情况。
1、有设备
把设备接入电脑,在xcode->window->device and simulators->device->view device logs查到对应的崩溃日志,xcode会自动给你符号化,但可能符号话的效果没那么好,看下图
2、没有设备
没有设备的话,有两种方式去分析
i. 使用mac自带的symbolicatecrash工具
ii. 使用atos
下边分别讲下
i.使用mac自带的symbolicatecrash工具
a.找到symbolicatecrash的目录,执行命令
find /Applications/Xcode.app -name symbolicatecrash -type f
使用真机下的symbolicatecrash,即图中红框里的。
b. 拿到dSYM文件,这里保存着app的符号表,把dSYM文件和crash文件放到一个文件夹下,
首先需要确认crash文件和dSYM文件是同一个UUID的
查看dSYM文件的UUID如下
dwarfdump --uuid mtmap.app.dSYM
查看crash文件的UUID,crash文件是设备的,只有一个arm架构
grep "mtmap arm64" *crash
配置环境变量
临时方案
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
永久方案
编辑 ~/.bash_profile(笔者用的是 zsh,所以这里编辑的是 ~/.zshrc),在末尾添加
# Add environment variable DEVELOPER_DIR export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
配置好环境后,执行命令
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash
ii. atos方式
atos需要dSYM文件和crash的地址。命令为
xcrun atos -arch 架构 -o 二进制包 -l 模块load地址(基地址) 调用方法的地址