天天看点

关于Hockey app 里的Crash 分析

首先上一张Hockey里的crash记录

关于Hockey app 里的Crash 分析

Incident Identifier:崩溃报告的唯一标识符,不同的Crash日志该标示符也不同。

CrashReporter Key:设备标识相对应的唯一键值(并非真正的设备的UDID,苹果为了保护用户隐私iOS6以后已经无法获取)。通常同一个设备上同一版本的App发生Crash时,该值都是一样的。

Hardware Model :代表发生Crash的设备类型。

Process:代表系统Crash的进程名称,通常都是我们的App的名字, [ ]里面是当时进程的ID。

Path:App的所在路径。

Identifier:我们App的Indentifier,就是你app的bundle Indentifier。

AppVersion:当前App的版本号,由Info.plist中的两个字段组成,CFBundleShortVersionString and CFBundleVersion。

Code Type:当前App的CPU架构。

Parent Process:当前进程的父进程,由于iOS中App通常都是单进程的,一般父进程都是launchd。

Date/Time:发生crash的时间

Launch Time:启动App的时间

OS Version:iOS系统固件版本

Report Version:日志版本

Exception Type: 这个信息非常重要,它就像是这个crash的名字。

Crashed Thread: 问题发生的thread

我一般都直接看最后的thread 然后找到对应的crash的thread

关于Hockey app 里的Crash 分析

一般这个thread 后都会跟着crash。 然后从下往上是堆栈信息,这里左边数字后跟着你们项目的Target 说明是代码里的问题 如果是Foundation 或者 其他的,可以忽略。找到最后你们Target那一条目,然后后边跟着的方法 以及类里多少行,方便你去定位错误位置。

但是有些问题只看这里,是解决不了的!

这时候就需要Exception Type 还有其他的地方来配合看了。

1. 首先有一些常见的Exception code,https://en.wikipedia.org/wiki/Hexspeak  请自行查看。

2. Exception Type

1)EXC_BAD_ACCESS

此类型的Excpetion是我们最长碰到的Crash,通常用于访问了不改访问的内存导致。一般EXC_BAD_ACCESS后面的"()"还会带有补充信息。

SIGSEGV:通常由于重复释放对象导致,这种类型在切换了ARC以后应该已经很少见到了。

SIGABRT:收到Abort信号退出,通常Foundation库中的容器为了保护状态正常会做一些检测,例如插入nil到数组中等会遇到此类错误。

SEGV:(Segmentation  Violation),代表无效内存地址,比如空指针,未初始化指针,栈溢出等;

SIGBUS:总线错误,与 SIGSEGV 不同的是,SIGSEGV 访问的是无效地址,而 SIGBUS 访问的是有效地址,但总线访问异常(如地址对齐问题)

SIGILL:尝试执行非法的指令,可能不被识别或者没有权限

2)EXC_BAD_INSTRUCTION

此类异常通常由于线程执行非法指令导致。

1.在代码中修改了storyboard与outlet的对应关系,但是storyboard没有更新时发生过此crash。

2.与第三方库中方法冲突时发生过此crash。

3.调用系统方法时传入了不恰当的指针类型。

3)EXC_ARITHMETIC

代码中做除法时分母为零了会发生此问题。

继续阅读