iOS手动Crash解析

crash 日志格式

百度移动统计iOS SDK获取的crash日志不是完整的系统生成日志,其内容主要包括异常类型、原因、Backtrace调用等。SDK V3.5版本以下Crash日志格式如下:

  1. Hi
  2. 使用app时发生了崩溃, 详细错误信息如下:
  3. *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 1]'
  4. 详细错误信息:
  5. (
  6. 0 CoreFoundation 0x0000000186ebe5b8 + 160
  7. 1 libobjc.A.dylib 0x00000001975c40e4 objc_exception_throw + 60
  8. 2 CoreFoundation 0x0000000186da362c + 0
  9. 3 BaiduStatApp 0x000000010009e824 BaiduStatApp + 288804
  10. 4 BaiduStatApp 0x00000001000aca04 BaiduStatApp + 346628
  11. 5 BaiduStatApp 0x00000001000a56e8 BaiduStatApp + 317160
  12. 6 BaiduStatApp 0x00000001000bf754 BaiduStatApp + 423764
  13. 7 Foundation 0x0000000187d91d90 + 372
  14. 8 CoreFoundation 0x0000000186e769ec + 24
  15. 9 CoreFoundation 0x0000000186e75c90 + 264
  16. 10 CoreFoundation 0x0000000186e73d40 + 712
  17. 11 CoreFoundation 0x0000000186da10a4 CFRunLoopRunSpecific + 396
  18. 12 GraphicsServices 0x000000018ff435a4 GSEventRunModal + 168
  19. 13 UIKit 0x000000018b6d2aa4 UIApplicationMain + 1488
  20. 14 BaiduStatApp 0x000000010007f318 BaiduStatApp + 160536
  21. 15 libdyld.dylib 0x0000000197c32a08 + 4
  22. )

SDK V3.5及以上的SDK,日志格式会在头部新增相关信息,如下:

  1. UUID: 538572BD-D973-3D55-A475-4579BA0BECBF
  2. NAME: BaiduMobStatSample
  3. ARCH: x86_64
  4. 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地址

  1. 3 BaiduStatApp 0x000000010009e824 BaiduStatApp + 288804

上面的这行信息中第一位减去最后一位,得到

  1. 0x000000010009e824 288804 0x0000000100058000

最后得出的数,即app loadAddress

  • 使用指令解析取当前模块的运行地址,例如:
  1. 3 BaiduStatApp 0x000000010009e824 BaiduStatApp + 288804

上面的这行信息中0x000000010009e824就是当前模块运行地址。结合上一步获取的load address起始地址,执行如下指令:

  1. xcrun atos --arch arm64 -o xxx.app/xxx -l 0x0000000100058000 0x000000010009e824

得到如下解析结果:

  1. -[BaiduViewController viewDidLoad:] (in BaiduStatApp) (BaiduViewController.m:272)

结果中包含所在类名、函数名、文件名及对应行数。