深入理解iOS Crash Log

本文详细介绍了如何分析和处理iOS应用的Crash Log,包括从设备获取和XCode下载Crash Log,分析Crash Log的Header、Reason、Thread和可执行文件,以及Symbolication的过程,讲解了atos、symbolicatecrash和lldb等工具的使用,并分享了针对不同异常类型的调试技巧。
摘要由CSDN通过智能技术生成

Crash Log

Crash Log的主要来源有两种:

  1. Apple提供的,可以从用户设备中直接拷贝,或者从iTunes Connect(XCode)下载
  2. 三方或者自研Framework统计,三方服务包括Fabric,Bugly等。

这篇文章讲到的Crash Log是Apple提供的。

获取

设备获取

USB连接设备,接着在XCode菜单栏依次选择:Window -> Devices And Simulators,接着选择View Device Logs

Devices And Simulators

然后,等待XCode拷贝Crash Log,在右上角可以通过App的名字搜索,比如这里我搜索的是微信,可以右键导出Crash Log到本地来分析:

Export

在查看Crash Log的时候,XCode会自动尝试Symboliate,至于什么是Symboliate会在本文后面讲解。

XCode下载

在XCode菜单栏选择Window -> Organizer,切换到Crashes的Tab,选择版本后就可以自动下载对应版本的crash log:

XCode

选择Open In Project,然后选择对应的项目,然后就是我们日常开发中熟悉的界面了:

Project

分析

用于Demo的是一个微信的Crash Log:

  • WeChat-2018-6-11-21-54.crash
  • 设备信息:iPhone 7,iOS 12 beta1
  • 版本信息:微信 6.6.7.32 (6.6.7)

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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值