如何分析Crash日志

iOS Crash Log 解析

#1 简介
Crash Log 是用来分析 Crash 问题的主要手段。

#2 示例
下面的 Crash Log 取自于天猫客户端,Log 中不重要的部分已经被略去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Incident Identifier: C7F427F7-FDF8-41C3-9659-3C54756B1547
CrashReporter Key: TODO
Hardware Model: iPhone8,2
Process: Tmall4iPhone [1313]
Path: /var/containers/Bundle/Application/5F09E0C7-C766-42D8-B2C7-31E335F73349/Tmall4iPhone.app/Tmall4iPhone
Identifier: Unknown|com.taobao.tmall
Version: 5.24.1 (5.24.1)
Code Type: ARM-64
Parent Process: ??? [1]
Date/Time: 2016-10-07 03:16:35 +0000
OS Version: iPhone OS 10.0.1 (14A403)
Report Version: 104
Exception Type: SIGSEGV
Exception Codes: SEGV_ACCERR at 0x110
Triggered by Thread: 42

Thread 0:
0 libsystem_kernel.dylib 0x0000000186bf016c _mach_msg_trap :8 (in libsystem_kernel.dylib)
1 CoreFoundation 0x0000000187bedcec ___CFRunLoopServiceMachPort :192 (in CoreFoundation)
2 CoreFoundation 0x0000000187beb908 ___CFRunLoopRun :1132 (in CoreFoundation)
3 CoreFoundation 0x0000000187b1a048 _CFRunLoopRunSpecific :444 (in CoreFoundation)
4 GraphicsServices 0x000000018959d198 _GSEventRunModal :180 (in GraphicsServices)
5 UIKit 0x000000018daf3818 -[UIApplication _run] :684 (in UIKit)
6 UIKit 0x000000018daee550 _UIApplicationMain :208 (in UIKit)
7 Tmall4iPhone 0x000000010006bf7c main main.m:27 (in Tmall4iPhone)
8 libdyld.dylib 0x0000000186afc5b8 _start :4 (in libdyld.dylib)

Thread 42 Crashed:
0 CFNetwork 0x00000001883cd970 __ZN15TCPIOConnection12copyPropertyEPK10__CFString :44 (in CFNetwork)
1 CFNetwork 0x00000001882a49c4 __ZN14SPDYConnection20_onqueue_closeStreamEP10SPDYStream :236 (in CFNetwork)
2 CFNetwork 0x00000001882a48b4 ____ZN14SPDYConnection19startEnqueuedStreamEP10SPDYStream_block_invoke_2 :28 (in CFNetwork)
3 libdispatch.dylib 0x0000000186ac9200 __dispatch_call_block_and_release :24 (in libdispatch.dylib)
4 libdispatch.dylib 0x0000000186ac91c0 __dispatch_client_callout :16 (in libdispatch.dylib)
5 libdispatch.dylib 0x0000000186ad7444 __dispatch_queue_serial_drain :928 (in libdispatch.dylib)
6 libdispatch.dylib 0x0000000186acc9a8 __dispatch_queue_invoke :652 (in libdispatch.dylib)
7 libdispatch.dylib 0x0000000186ad938c __dispatch_root_queue_drain :572 (in libdispatch.dylib)
8 libdispatch.dylib 0x0000000186ad90ec __dispatch_worker_thread3 :124 (in libdispatch.dylib)
9 libsystem_pthread.dylib 0x0000000186cd12c8 __pthread_wqthread :1288 (in libsystem_pthread.dylib)
10 libsystem_pthread.dylib 0x0000000186cd0db4 _start_wqthread :4 (in libsystem_pthread.dylib)

Thread State:
lr:0x00000001882a49c4 x6:0x0000000170ade8b0 x7:0x0000000000000450 x4:0x0000000000000001
x5:0x0000000000000010 x2:0x0000021aaf85c0e0 x3:0xfffffff0001fc088 x0:0x0000000000000000
x1:0x00000001ab457998 cpsr:0x0000000080000000 x10:0x0000000000077234 x16:0xfffffff100000000
x15:0xfffffff500000000 x18:0x0000000000000000 x17:0x003000000000f49f x12:0xffc0000800000000
x11:0x0000000000049198 x14:0xfffffffd00000001 fp:0x000000016e5b2c50 x13:0x0000000800000000
sp:0x000000016e5b2b70 x19:0x00000001701574a0 x21:0x00000001ab457998 x9:0x0000000000000000
x8:0x00000001a6bcc000 x20:0x0000000000000000 pc:0x00000001883cd970 x28:0xffffffffffffffff
x27:0x000000016e5b30e0 x26:0x0000000000000014 x25:0x0000000000000000 x24:0x0000000000000000
x23:0x00000001746f2580 x22:0xdc990b23045700ad

Binary Images:
0x0000000100064000 - 0x0000000103517fff Tmall4iPhone arm64 <d21caba7463b3a38a7ee3ae16448f4b6> /var/containers/Bundle/Application/5F09E0C7-C766-42D8-B2C7-31E335F73349/Tmall4iPhone.app/Tmall4iPhone
0x000000018823b000 - 0x00000001885aafff CFNetwork arm64 <ca09941bfd353bb8b6b679a0f14cad1e> /System/Library/Frameworks/CFNetwork.framework/CFNetwork

#3 关注点
Identifier: Unknown|com.taobao.tmall, 在这里区分是线上版本还是线下开发版本.
Version: 5.24.1 (5.24.1), 应用版本号.
Code Type: ARM-64, 代码架构, 目前有ARM/ARM-64两种.
OS Version: iPhone OS 10.0.1 (14A403), 系统版本及build号, 用来查找系统库文件, 用于疑难问题的排查.
Exception Type: SIGSEGV, 异常类型常见的有SIGSEGV/SIGABRT/SIGTRAP/SIGBUS/SIGILL等.
Exception Codes: SEGV_ACCERR at 0x110, 非法访问0x110这个没有访问权限的地址.
Triggered by Thread: 42, 挂的线程是Thread 42, 待会看调用栈的时候, 看Thread 42的调用栈就好.

1
2
3
4
5
SIGSEGV 访问了非法的地址(地址还没有从系统映射到当前进程的内存空间), 一般是野指针导致, 而野指针一般由于多线程操作对象导致.
SIGABRT 一般是Exception或者其他的代码主动退出的问题.
SIGTRAP 代码里面触发了调试指令, 该指令可能由编译器提供的trap方法触发, 如'__builtin_trap()'
SIGBUS 一般由于地址对齐问题导致, 单纯的OC代码挺难触发的, 主要是系统库方法或者其他c实现的方法导致
SIGILL 表示执行了非法的cpu指令, 但是一般是由于死循环导致

那么我们来看 Thread 42

1
2
3
Thread 42 Crashed:
0 CFNetwork 0x00000001883cd970 __ZN15TCPIOConnection12copyPropertyEPK10__CFString :44 (in CFNetwork)
1 CoreFoundation 0x0000000187bedcec ___CFRunLoopServiceMachPort :192 (in CoreFoundation)

这里我们取了两条调用栈记录, 这里的每条调用记录都叫做frame, 每条有一个编号0和1, 这个编号代表的是frame number, 它是当前frame在整个调用栈中的索引.

先看frame #0, frame #0是当前调用的方法的信息, 0 CFNetwork 0x00000001883cd970 __ZN15TCPIOConnection12copyPropertyEPK10__CFString :44 (in CFNetwork), CFNetwork代表当前frame调用的方法所在的镜像(可执行文件或动态库)的名称, 0x00000001883cd970代表当前执行的指令在内存中的地址(也就是crash的指令的地址), __ZN15TCPIOConnection12copyPropertyEPK10__CFString :44 是前面那个地址符号化后的方法名称, :44表示挂的指令相对于符号化出来的方法的首地址的偏移量.

再看frame #1, frame #1是调用frame #0方法的地方, 1 CoreFoundation 0x0000000187bedcec ___CFRunLoopServiceMachPort :192 (in CoreFoundation), 镜像名和地址不多说, 这里要说说偏移量:192, 除了frame #0的方法地址是取的pc寄存器的内容(存放的当前指令的地址), 而其他frame实际上存的都是历史记录, 而为了省内存和cpu, frame中并不会保存所有的寄存器的值, 只存了lr寄存器的内容(存放的是方法调用完后要返回的地址), 而返回地址是调用方法的地址的下一个指令地址. 因此偏移量192(lr), 对应的调用处的地址是188(pc).

其他frame的看法参见frame #1.

Thread State:, 后面跟的内容是在frame #0挂的时候的所有寄存器的值, 寄存器中可能存放的是一个指令的地址/一个指向对象的指针/一个数值. 寄存器的值结合汇编代码, 可以推断具体是对某个方法调用的参数或者类的成员变量导致的野指针. 后续会有详细的问题分析实战文章做介绍.

Binary Images: 表示当前运行时所加载的所有的镜像的名称/uuid/加载地址等信息. 看一条示例:

1
0x0000000100064000 - 0x0000000103517fff Tmall4iPhone arm64  <d21caba7463b3a38a7ee3ae16448f4b6> /var/containers/Bundle/Application/5F09E0C7-C766-42D8-B2C7-31E335F73349/Tmall4iPhone.app/Tmall4iPhone

000000100064000 - 0x0000000103517fff表示镜像Tmall4iPhone在内存中的加载地址的起始范围, 这个在符号化和调试疑难问题时是一个很重要的参考. Tmall4iPhone是镜像名称, arm64是架构, d21caba7463b3a38a7ee3ae16448f4b6是镜像的uuid, /var/containers/Bundle/Application/5F09E0C7-C766-42D8-B2C7-31E335F73349/Tmall4iPhone.app/Tmall4iPhone是镜像在用户手机上地址.

注1: uuid可以通过dwarfdump –uuid Tmall4iPhone 查看, 确定镜像是否相同.

作者

shouyi.www

发布于

2019-12-04

更新于

2025-01-30

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×