iOSCrash log分析

作为一名应用开发者,相信你经常碰到以下情景:

在你将应用提交到App Store之前,想必你已经做了大量的测试工作,在你的设备上它也运行的很好,然而,还是会出现使用时闪退的情况。相信大家已经做好了Crash log的收集工作。

Crash log主要分为两种情况:
1.连接真机进行调试
2.App Store上应用的Bug追踪

本文主要讲的是App Store上bug的分析。

image.png

上图正是Apple给的崩溃日志,下面我们逐步分析一下日志的内容。

1.进程信息
Incident Identifier:crash的id
CrashReporter Key:crash的设备id
Hardware Model:手机型号
Process:[app名字] [进程ID]
Path:app的位置
Identifier:bundle ID
Version:版本号
AppStoreTools
Code Type:arm64
Role:app处于前台
Parent Process
Coalition

2.基本信息
Date/Time:crash发生时间
Launch Time:app启动时间
OS Version:iOS版本
Release Type
Baseband Version
Report Version

3.异常信息
Exception Type:异常类型
Exception Codes:异常地址
Exception Note:描述
Triggered by Thread:异常发生的线程

4.异常回溯
发生异常时的线程堆栈

分析工具symbolicatecrash和atos

image.png

我们发现crash log上都是一些地址,根本不是我们所熟悉的代码,这时候我们就要借助symbolicatecrashatos进行分析。

在分析之前需要准备dSYM文件,crash logsymbolicatecrash(Xcode自带的崩溃分析工具)。

什么是dSYM文件?
Xcode编译项目后,我们会看到一个同名的 dSYM 文件,dSYM 是保存 16 进制函数地址映射信息的中转文件,我们调试的 symbols 都会包含在这个文件中,并且每次编译项目的时候都会生成一个新的 dSYM 文件,位于 /Users/用户名/Library/Developer/Xcode/Archives 目录下,对于每一个发布版本我们都很有必要保存对应的 Archives文件

dSYM文件作用
我们可以通过crash log中出错的函数地址去查询 dSYM 文件中程序对应的函数名和文件名

symbolicatecrash

1.在桌面新建一个文件夹crashtemp

  1. 找到symbolicatecrash工具 终端输入
find /Applications/Xcode.app -name symbolicatecrash -type f

找到"symbolicatecrash" 文件, 拷贝到刚才创建的 "crashtemp" 文件夹里。

3.Xcode->Window->Organizer->Archives 显示包内容获取dSYM文件拷贝到刚才创建的 "crashtemp" 文件夹里。

4.crash log文件拷贝到crashtemp里。

5.打开终端进入crashtemp文件夹:

cd /Users/username/Desktop/crashtemp

6.检验crash、dSYM文件是否匹配
每一个xx.app.dSYM 文件都有对应的 UUID,crash 文件也有自己的 UUID,只要这三个文件的 UUID 一致,我们就可以通过他们解析出正确的错误函数信息了。

在 terminal 中输入以下命令,查看UUID:

dwarfdump --uuid xx.app/xx //查看.app的UUID(xx代表你的项目名)
dwarfdump --uuid xx.app.dSYM  // 查看.dSYM的UUID


crash 文件内第一行 Incident Identifier 就是该 crash 文件的 UUID

7.输入以下命令

export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer

./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash //*是文件名

这时候终端将会进行处理......
生成一个新的文件symbol.crash,这就是我们认识的crash文件。

atos

有时候通过symbolicatecrash并不能解析出来崩溃信息,或者APP自身的堆栈能解析出来,但是系统的堆栈解析不出来。

可以通过atos命令逐行解析,通过这个命令可以解析指定的某一行堆栈。

atos -o yourAppName.app.dSYM/Contents/Resources/DWARF/yourAppName -arch arm64/armv7 -l <load-address> <address>

load-address:报错地址
address:镜像的首地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容