将crsah日志符号化需要做以下准备
- .crash日志
- .dSYM符号集
- symbolicatecrash工具
获取crash日志的途径
- 使用友盟、BugHD、Crashlytics等第三方崩溃统计工具
- 自己实现应用内崩溃收集,并上传服务器
- 根据以下路径
Xcode → Window → Devices → View Device Logs → This Device
去直接查看设备的崩溃信息
- 使用苹果提供的Crash崩溃收集服务
获取.dSYM文件
- 进入
Xcode → Window → Organizer → Archives
中
- 选中archive的版本右击选择
Show in Finder
- 可以看到对应
.xcarchive
文件,右键选择显示包内容,在dSYMs文件夹中就可以获取dSYM文件了
如何确认.crash文件和.dSYM文件是匹配的呢?
- 将.app文件、.dSYM文件以及.crash文件放到同一个文件夹下,打开终端,定位到该文件夹,继续下面的操作
- 每一个.dSYM文件都有一个UUID和.app文件中的UUID对应,崩溃信息也有一个单独的UUID,用来和程序的UUID进行校对
- 查看xxx.app文件的UUID的命令
dwarfdump --uuid xxx.app/xxx
dwarfdump --uuid xxx.app.dSYM
- .crash文件内第一行
Incident Identifier
就是该.crash文件的UUID
- 如果
.crash
和.dSYM
文件的UUID都匹配上了,就可以顺利将16进制堆栈信息进行符号化了
- 备注:进行崩溃信息符号化的时候,
必须
使用当前应用打包的电脑
所生成的dSYM文件,其他电脑生成的文件可能会导致分析不准确的问题
获取Xcode自带的symbolicatecrash工具
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash
将crash日志进行符号化的步骤
- 将
.crash
、.dSYM
文件和symbolicatecrash
工具放在同一级文件夹下,比如我这里放在桌面的Crash文件夹中
- 打开终端,cd到Crash文件夹下,再执行下面的命令,会生成符号化好的
symbol.crash
文件
./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash
- 如果上面命令不成功,执行下面的命令,再执行上面的命令就可以了
#设置一下导出的环境变量
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
#检查一下环境变量
xcode-select -print-path
以下情况不会有崩溃信息产生
- 内存访问错误(不是野指针错误)
- 低内存,当程序内存使用过多会造成系统低内存的问题,系统会将程序内存回收
- 因为某种原因触发看门狗机制
通过Xcode查看设备崩溃信息
- 根据以下路径
Xcode → Window → Devices → View Device Logs → This Device
去直接查看设备的崩溃信息
- 只要手机上安装的应用是由
当前查看崩溃信息的电脑
打包的,系统会自动为我们将崩溃信息符号化好,点击日志文件进去之后等一会(不要相信这里面的进度刷新,并不准确)就会自动符号化好,如果还是没有符号化完毕,我们选择文件右击选择Re-Sysbomlicate
就可以了
- 如果不是在这台电脑打包的,就按照上面的
将crash日志中的16进制堆栈信息进行符号化
的步骤一步步操作
第三方工具恶意覆盖
- 我们解析崩溃信息时,看到崩溃堆栈
只有main.m
文件中的崩溃,并且确定不是因为main.m文件中的bug导致的崩溃,就基本可以确定是NSSetUncaughtExceptionHandler()
函数指针被恶意覆盖
第三方崩溃分析工具推荐
参考资料