iOS手动Crash解析
crash 日志格式
百度移动统计iOS SDK获取的crash日志不是完整的系统生成日志,其内容主要包括异常类型、原因、Backtrace调用等。SDK V3.5版本以下Crash日志格式如下:
Hi
使用app时发生了崩溃, 详细错误信息如下:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 1]'
详细错误信息:
(
0 CoreFoundation 0x0000000186ebe5b8 + 160
1 libobjc.A.dylib 0x00000001975c40e4 objc_exception_throw + 60
2 CoreFoundation 0x0000000186da362c + 0
3 BaiduStatApp 0x000000010009e824 BaiduStatApp + 288804
4 BaiduStatApp 0x00000001000aca04 BaiduStatApp + 346628
5 BaiduStatApp 0x00000001000a56e8 BaiduStatApp + 317160
6 BaiduStatApp 0x00000001000bf754 BaiduStatApp + 423764
7 Foundation 0x0000000187d91d90 + 372
8 CoreFoundation 0x0000000186e769ec + 24
9 CoreFoundation 0x0000000186e75c90 + 264
10 CoreFoundation 0x0000000186e73d40 + 712
11 CoreFoundation 0x0000000186da10a4 CFRunLoopRunSpecific + 396
12 GraphicsServices 0x000000018ff435a4 GSEventRunModal + 168
13 UIKit 0x000000018b6d2aa4 UIApplicationMain + 1488
14 BaiduStatApp 0x000000010007f318 BaiduStatApp + 160536
15 libdyld.dylib 0x0000000197c32a08 + 4
)
SDK V3.5及以上的SDK,日志格式会在头部新增相关信息,如下:
UUID: 538572BD-D973-3D55-A475-4579BA0BECBF
NAME: BaiduMobStatSample
ARCH: x86_64
ADDR: 0x100000000
解析说明
- 由于日志格式不是完整的iOS crash日志,所以无法使用Xcode自带的symbolicatecrash工具进行整体日志解析。这里我们使用系统命令进行逐行解析。
- 对于系统库所对应的函数定位(例如Foundation、UIKit库等)这里不做解析,解析的是开发者自定义的项目工程中的代码位置(例如上图中BaiduStatApp),也是对于开发者定位函数位置最有价值的信息。
所需材料
发布时的.app文件。若提交时候使用的是.xcarchive文件,则可以通过右键>显示包内容,然后通过路径XXX.xcarchive/Products/Applications/xxx.app
找到。
解析步骤
- 获取load address相对偏移解析, 可以取头部中ADDR的值
若是SDK V3.5以下版本获取的Crash日志,通过如下方法得到app load地址
3 BaiduStatApp 0x000000010009e824 BaiduStatApp + 288804
上面的这行信息中第一位减去最后一位,得到
0x000000010009e824 - 288804 = 0x0000000100058000
最后得出的数,即app loadAddress
- 使用指令解析取当前模块的运行地址,例如:
3 BaiduStatApp 0x000000010009e824 BaiduStatApp + 288804
上面的这行信息中0x000000010009e824
就是当前模块运行地址。结合上一步获取的load address起始地址,执行如下指令:
xcrun atos --arch arm64 -o xxx.app/xxx -l 0x0000000100058000 0x000000010009e824
得到如下解析结果:
-[BaiduViewController viewDidLoad:] (in BaiduStatApp) (BaiduViewController.m:272)
结果中包含所在类名、函数名、文件名及对应行数。