iOS 崩溃知识初了解

1.EXC_BAD_ACCESS
在访问一个已经被释放的对象或者向该已经被释放的对象发送消息时,EXC_BAD_ACCESS 就会出现。出现EXC_BAD_ACCESS常见的原因有:初始化方法初始化变量的时候用错了权限修饰符,因而导致对象被释放,例如,在数组初始化的时候,将其权限修饰符设成了assign而不是strong ,那么如果该数组作为tableView的数据源,在cellForRowAtIndePath:中访问了该数组,就会出现EXC_BAD_ACCESS。
在调试EXC_BAD_ACCESS这种崩溃的时候,就会提到NSZomebieEnabled环境变量,它主要是调试和内存相关的问题,跟踪对象的释放过程。启用了NSZomebieEnabled,他会用一个僵尸实现来替换默认的dealloc实现,即是在引用计数将为0的时候,该僵尸实现会将该对象转换为将是对象。僵尸对象的作用就是,你在给将是对象发消息的时候,它会显示一段日志并自动跳转调试器。具体怎么启用NSZomebieEnabled呢?你可以在Xcode的Scheme页面中设置NSZomebieEnabled,点击Product - Edit Scheme打开,然后勾选Enable Zomebie Objects即可。末尾继续说一嘴,在ARC出现之前,NSZomebieEnabled很有效果,但是ARC出现之后,基本上都会注意对象修饰符和常见的EXC_BAD_ACCESS情况,在内存方便碰到的问题就比较少了。

2 SIGSEGV
段错误信号(SIGSEGV),当硬件出现错误、访问不可读的内存地址、向受保护的内存写入数据,就会出现这个错误。一般硬件错误的情况比较少,更多的是后面两种情况导致SIGSEGV错误。比如,当你要读取一个指针的值,而它被初始化成指向无效内存地址的时候,就会收到SIGSEGV。
SIGSEGV调试起来比较困难,最常见的就是不正确的类型转换,所以要避免过度使用指针或者尝试手动修改指针来读取私有数据类型。如果你这么做,而在修改指针的时候没有注意内存对齐和填充问题,SIGSEGV错误就不可避免。

3 SIGBUS
总线错误信号(SIGBUS),无效内存访问,意思就是访问的内存是一个无效的内存地址。例如,访问的地址不是指向某一个物理内存地址,而是某个硬件芯片的地址。

4 SIGTRAP
陷阱信号(SIGTRAP),它并不是一个真正的崩溃信号。处理器执行trap指令时会发送该信号,LLDB调试器通常会处理此信号,并在指定的断点处停止运行。收到SIGTRAP的处理方式通常就是,清除上次的输出,然后重新进行构建。

5 EXC_ARITHMETIC
例如除以0,就会收到该信号,很容易解决

6 SIGILL
非法指令信号(SIGNAL ILLEGAL INSTRUCTION ),在处理器上执行非法指令的时候,就会发生。执行非法指令指的是,将函数指针传给另外一个函数时,该函数指针由于某种原因是坏的,指向了一段已经释放的内存或者是一个数据段。有时候你收到的是EXC_BAD_INSTRUCTION而不是SIGILL,虽然他们是一回事,不过EXC_* 等同于此信号不依赖体系结构。

7.SIGABRT
中止信号(SIGNAL ABORT),当操作系统发现不安全的情况时,它能够对这种情况进行更多的控制,必要时也会要求进程进行清理工作,cocos2d或者UIKit等框架通常会在特定的前提条件没有满足或一些糟糕情况出现时调用C的abort函数。当SIGABRT出现时,控制台一般会输出大量信息,说明具体哪里错了。并且由于它是可以控制的崩溃,所以在LLDB控制台可通过bt命令打印出回溯信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值