手动crash解析

优质
小牛编辑
151浏览
2023-12-01

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

解析说明

  1. 由于日志格式不是完整的iOS crash日志,所以无法使用Xcode自带的symbolicatecrash工具进行整体日志解析。这里我们使用系统命令进行逐行解析。
  2. 对于系统库所对应的函数定位(例如Foundation、UIKit库等)这里不做解析,解析的是开发者自定义的项目工程中的代码位置(例如上图中BaiduStatApp),也是对于开发者定位函数位置最有价值的信息。

所需材料

发布时的.app文件。若提交时候使用的是.xcarchive文件,则可以通过右键>显示包内容,然后通过路径XXX.xcarchive/Products/Applications/xxx.app找到。

解析步骤

  1. 获取load address相对偏移解析, 可以取头部中ADDR的值

    若是SDK V3.5以下版本获取的Crash日志,通过如下方法得到app load地址

     3   BaiduStatApp                        0x000000010009e824 BaiduStatApp + 288804
    

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

       0x000000010009e824 - 288804 = 0x0000000100058000
    

    最后得出的数,即app loadAddress

  2. 使用指令解析 取当前模块的运行地址,例如:

    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)
    

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