最近测试用测试机测试项目时发生闪退,心想应该是偶现 bug,不好重现又不是处于 Xcode run 状态。所以准备将测试的测试机的 crash log 导出研究下,有想法便着手来做。
Xcode 自带可以导出某个设备的 Crash
选中 Devices 进入
找出某时某项目出现的 crash 导出
打开导出的 .crash 文件
看到这个我是拒绝的,头都大了。
硬着头皮来看:
第一部分
一些基本信息设备版本,路径,identifier等。
第二部分
Exception Type:异常的类型。
Exception Codes :异常错误码
Termination Reason:闪退的原因,比如常见的数组越界啊,什么的。
Triggered by Thread:出现问题在哪个线程,这个比较重要,首先确定在哪个线程中出了问题,然后再去定位。
第三部分
发生崩溃前后执行的代码
CoreFoundation 0x18f6c51b8 __exceptionPreprocess + 124
1 libobjc.A.dylib 0x18e0fc55c objc_exception_throw + 56
2 CoreFoundation 0x18f6c5100 +[NSException raise:format:] + 116 // 生成异常,后面是抛出异常
3 PayDayLoan_Yongqianhua 0x1002fabd8 UmengSignalHandler + 128 // 友盟统计捕获异常
4 libsystem_platform.dylib 0x18e755338 _sigtramp + 36
5 libsystem_kernel.dylib 0x18e68e49c abort_with_payload_wrapper_internal + 100
6 libsystem_kernel.dylib 0x18e68e4c8 abort_with_payload + 12 // 这两条才是关键
进行查阅资料,发现这两条是调用设备的相机,日历等等没有在 plist 文件中加对应字段引起的问题,才想起来最近的新增的需求是有个访问日历,定位到了 bug所在。
线程一:发生bug 的线程
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x000000018e693014 __pthread_kill + 8
1 libsystem_pthread.dylib 0x000000018e75b450 pthread_kill + 112
2 libsystem_c.dylib 0x000000018e607400 abort + 140 // 在异常发生后,线程直接 kill 了,导致了闪退。
3 libc++abi.dylib 0x000000018e0d12d4 __cxa_bad_cast + 0
4 libc++abi.dylib 0x000000018e0eecc0 default_unexpected_handler() + 0
5 libobjc.A.dylib 0x000000018e0fc844 _objc_terminate() + 124
6 libc++abi.dylib 0x000000018e0eb66c std::__terminate(void (*)()) + 16
7 libc++abi.dylib 0x000000018e0eb234 __cxa_rethrow + 144
8 libobjc.A.dylib 0x000000018e0fc71c objc_exception_rethrow + 44
9 CoreFoundation 0x000000018f59e32c CFRunLoopRunSpecific + 560
10 GraphicsServices 0x0000000191052198 GSEventRunModal + 180
11 UIKit 0x00000001955e57fc -[UIApplication _run] + 684
12 UIKit 0x00000001955e0534 UIApplicationMain + 208
13 PayDayLoan_Yongqianhua 0x0000000100168dd4 main (main.m:14)
14 libdyld.dylib 0x000000018e5815b8 start + 4