Crash Log
Crash Log的主要来源有两种:
- Apple提供的,可以从用户设备中直接拷贝,或者从iTunes Connect(XCode)下载
- 三方或者自研Framework统计,三方服务包括Fabric,Bugly等。
这篇文章讲到的Crash Log是Apple提供的。
获取
设备获取
USB连接设备,接着在XCode菜单栏依次选择:Window -> Devices And Simulators,接着选择View Device Logs
然后,等待XCode拷贝Crash Log,在右上角可以通过App的名字搜索,比如这里我搜索的是微信,可以右键导出Crash Log到本地来分析:
在查看Crash Log的时候,XCode会自动尝试Symboliate,至于什么是Symboliate会在本文后面讲解。
XCode下载
在XCode菜单栏选择Window -> Organizer,切换到Crashes的Tab,选择版本后就可以自动下载对应版本的crash log:
选择Open In Project,然后选择对应的项目,然后就是我们日常开发中熟悉的界面了:
分析
用于Demo的是一个微信的Crash Log:
- WeChat-2018-6-11-21-54.crash
- 设备信息:iPhone 7,iOS 12 beta1
- 版本信息:微信 6.6.7.32 (6.6.7)
Header
Crash Log的最开始是头部,这里包含了日志的元数据:
//crash log的唯一标识符
Incident Identifier: 4F85AD99-CF91-4240-BBC7-AEAFA51ED7FC
//处理过的设备标识符,同一台设备的crash log是一样的
CrashReporter Key: c84934ca1eae8ba4209ce4725a52492c77d05add
Hardware Model: iPhone9,1
Process: WeChat [31763]
Path: /private/var/containers/Bundle/Application/11F1F5DE-2F68-4331-A107-FAADCED42A1F/WeChat.app/WeChat
Identifier: com.tencent.xin
Version: 6.6.7.32 (6.6.7)
Code Type: ARM-64 (Native)
Role: Non UI
Parent Process: launchd [1]
Coalition: com.tencent.xin [12577]
Date/Time: 2018-06-11 21:54:07.2673 +0800
Launch Time: 2018-06-11 21:53:55.2690 +0800
OS Version: iPhone OS 11.3 (15E216)
Baseband Version: 3.66.00
Report Version: 104
Reason
接着是崩溃原因模块:
Exception Type: EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d
Termination Description: SPRINGBOARD, scene-create watchdog transgression: com.tencent.xin exhausted CPU time allowance of 2.38 seconds | | ProcessVisibility: Background | ProcessState: Running | WatchdogEvent: scene-create | WatchdogVisibility: Background | WatchdogCPUStatistics: ( | "Elapsed total CPU time (seconds): 23.520 (user 23.520, system 0.000), 100% CPU", | "Elapsed application CPU time (seconds): 5.151, 22% CPU" | )
Triggered by Thread: 0
Exception Type表示异常的类型:
Exception Type: EXC_CRASH (SIGKILL)
在<mach/exception_types.h>
我们可以找到这个EXC_CRASH
的具体含义:非正常的进程退出。
#define EXC_CRASH 10 /* Abnormal process exit */
那么SIGKILL又代表什么意思呢?在头文件<sys/signal.h>
中可以找到:
#define SIGKILL 9 /* kill (cannot be caught or ignored) */
表示这个这是一个无法捕获也不能忽略的异常,所以系统决定杀掉这个进程。
Exception Note中的代码同样在<mach/exception_types.h>
可以找到
#define EXC_CORPSE_NOTIFY 13 /* Abnormal process exited to corpse state */
Termination Reason提供的信息就更详细一些了
Termination Reason: Namespace SPRINGBOARD, Code 0