首先上一张Hockey里的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
一般这个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
代码中做除法时分母为零了会发生此问题。