1. 崩溃

1.1. 说明

1.1.1. Exception Type

EXC_BAD_ACCESS

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

  • SIGSEGV: 通常由于重复释放对象导致,这种类型在切换了ARC以后应该已经很少见到了。
  • SIGABRT: 收到Abort信号退出,通常Foundation库中的容器为了保护状态正常会做一些检测,例如插入nil到数组中等会遇到此类错误。

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

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

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

EXC_BAD_INSTRUCTION

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

EXC_ARITHMETIC

除零错误会抛出此类异常

1.2. 崩溃追踪

崩溃后直接跳到main函数

1.2.1. 1、add all

1.2.2. 2、add especiall

1.2.3. other

1.2.4. 启用NSZombieEnabled调试EXC_BAD_ACCESS

当你对已释放的对象发送消息(90%的可能是对引用计数为0的对象再release)或release那些autorelease对象时,就会出现报EXC_BAD_ACCESS这样的错误。 默认设置下 Xcode不会给你定位具体是哪一行代码不该去使用已释放的对象,或者release用错了。 Product -> Edit Scheme(option+command+R) -> Diagnostics -> 勾选 Enable Zombie Objects。 设置NSZombieEnabled环境变量后,一个对象销毁时会被转化为_NSZombie;设置NSZombieEnabled后,当你向一个已经释放的对象发送消息,这个对象就不只是报EXC_BAD_ACCESS Crash,还会放出一个错误消息,然后以一种可预测的可以产生debug断点的方式消失, 因此我们可以找到具体或者大概是哪个对象被错误的释放或引用了。 注意:NSZombieEnabled只能在调试的时候使用,千万不要忘记在产品发布的时候去掉,因为NSZombieEnabled不会真正去释放dealloc对象的内存,一直开启后果自负!

1.2.5. Clang Address Sanitizer

Clang的地址消毒剂

编辑scheme,点击Diagnostics标签页,选中"Enable Address Sanitizer"选项

1.3. 相关

results matching ""

    No results matching ""