crash 收集分析
当app发生crash时会产生crash report,查看crash记录对我们定位crash 的原因有很大的帮助,我们来看一下如何符号化、解析crash Report。
-
符号化 就是把内存地址用可读的函数名和行数来替换,
我们拿到的crash Report 信息一般都是堆栈信息,不可读,
例如:
image
如果想要读懂crash 日志,我们就需要把日志符号化,
获取crash
1.苹果Crash收集服务
新版iTunes Connect已不能看到APP的crash日志,只能在XCode 中Window->Organizer->Crashes可以看到crash日志。
当程序运行Crash的时候,系统会把运行的最后时刻的运行信息记录下来,存储到一个文件中,也就是我们所说的Crash文件,但收集crash功能需要用户设置->隐私->诊断与用量->诊断与用量数据选择自动发送,并与开发者共享,由于不是所有用户都会把这个功能打开,所以并不能保证收集到所有的Crash信息,推荐指数三颗星。
2.自行实现Crash收集及上报框架
实现原理上面已详细描述,适合人手充足,技术储备足够的团队使用,推荐指数五颗星。
3.第三方crash收集服务
腾讯bugly、友盟等Crash收集服务比较完善,作为开发者省心省力,适合个人或者对隐私性要求不高的团队使用,推荐指数五颗星。
符号化的三种方式
编译器在把你的源代码转换成机器码的同时,也会生成一份对应的Debug符号表。Debug符号表其实是一个映射表,它把每一个藏在编译好的binary信息中的机器指令映射到生成它们的每一行源代码中。通过build setting里的Debug Information Format(DEBUG_INFORMATION_FORMAT),这些Debug符号表要么被存储在编译好的binary信息中,要么单独存储在Debug Symbol文件中(也就是dSYM文件):一般来说,debug模式构建的app会把Debug符号表存储在编译好的binary信息中,而release模式构建的app会把debug符号表存储在dSYM文件中以节省体积。
在每一次的编译中,Debug符号表和app的binary信息通过构建时的UUID相互关联。每次构建时都会生成新的唯一的能够标识那次构建的UUID,即便你用同样的源代码,通过同样的编译setting,UUID也不会相同。相应的,dSYM文件也不能用于解析其它(UUID对应的)binary信息,即便构建自于同一个源代码
1、dSYM获取方式
- 1、从Xcode下载dSYM文件
xcode->window->organizer->右键你的应用 show finder->右键.xcarchive 显示包内容->dSYMs->test.app.dYSM -
2、从iTunes Connect网站上下载dSYM文件
打开App详情页面
点击 Activity
从所有的构建中,选择一个版本
点击 下载dSYM文件的链接
image
- 3 通过mdfind工具找回
在Bugly的issue页面查询到crash对应的UUID:
然后在Mac的Shell中,用mdfind命令定位dSYM文件:
mdfind "com_apple_xcode_dsym_uuids == <UUID>"
注意,使用mdfind时,UUID需要格式转换(增加“-”): 12345678-1234-1234-1234-xxxxxxxxxxxx 例如,要定位的dSYM的UUID为:E30FC309DF7B3C9F8AC57F0F6047D65F 则定位dSYM文件的命令如下
mdfind "com_apple_xcode_dsym_uuids == E30FC309-DF7B-3C9F-8AC5-7F0F6047D65F"
|12345678-1234-1234-1234-xxxxxxxxxxxx|
建议每次构建或者发布APP版本的时候,备份App对应的dSYM文件!
2、符号化过程
-
atos命令
atos命令可以把地址里的数字替换成等价的符号。如果调试符号信息是完备的,则atos的输出信息将会包含文件名和对应的资源行数。atos命令可以被用来单独符号化那些未符号化或者部分符号化过的crash report(中的堆栈信息里的地址)。
想要使用atos符号化crash report可以按如下方式操作: -
1、找到你想要符号化的那一行,记下第二列的binary信息名,以及第三列的地址。
-
2、从crash report底部的binary信息名列表中找到那个名字,记下来架构名和加载的地址。
atos [-arch 架构名] [-o 符号表] [-l 模块地址] [方法地址]
- 用Xcode符号化iOS的Crash report
一般来说,Xcode会自动尝试符号化它所有的Crash report。所以你只需要把crash report加到Xcode Organizer就可以了。
Note:Xcode只认.crash后缀的crash report。如果你收到的crash report没有后缀名或者后缀是txt,在执行下列步骤之前先把它改成.crash。
从Window菜单栏选择Devices
在Devices左侧,选择一个设备
点击右边在“Device Information“ 下面的 ”View Device Logs” 按钮
把你的Crash report拖拽到左侧panel中
Xcode会自动符号化Crash report并且显示结果
为了符号化一个Crash report,Xcode需要去定位如下信息:
崩溃的app的binary信息以及dSYM文件
所有app关联的自定义framework的binary信息以及dSYM文件。如果是从app构建出来的framework,它们的dYSM会随着app的dSYM文件一起拷贝到archive中。如果是第三方的framework,你需要去找作者要dYSM文件。
发生crash时app所依赖的OS的符号表信息。这些符号表包含了特定OS版本(例如iOS9.3.3)上的framework所需调试信息。 OS 符号表的架构具有独特性——一个64位的iOS设备不会包含armv7的符号表。Xcode将要自动拷贝你连接到的特定版本的Mac的符号表。
在上述任何一处,如果没有Xcode,你将无法符号化一个crash report,或者只能部分符号化一个crash report。
例如:
网友评论