iOS 开发之EXC_BAD_ACCESS异常分析

一:EXC_BAD_ACCESS异常介绍
在调试objective-c程序的过程中,程序crash的现象在所难免,但大部分的错误都能够通过显示的错误原因结合NSLog的方式来解决,比如NSInvalidArgumentException(名字就能看出来是什么错误)等,实在搞不定还有debug这个杀手锏。但唯独EXC_BAD_ACCESS这个异常太难处理了,名字看不出来是什么原因,其他提示也没有,debug都搞不定。
先来介绍下EXC_BAD_ACCES:这个异常基本上是内存使用不当造成的,而且90%的错误来源在于对一个已经释放的对象进行release操作。

二:分析方法
为工程运行时加入 NSZombieEnabled 环境变量,并设为启用,则在 EXC_BAD_ACCESS 发生时,XCode 的 Console 会打印出问题描述。并同时添加MallocStackLogging和MallocStackLoggingNoCompact两个环境变量,来启用malloc记录
edit-scheme.png


add-environment.png

三:输出信息
只要添加了NSZombieEnabled变量,在发生EXC_BAD_ACCESS会在concole中打印出错误原因,绝大多数都会出现这个信息
dealloc.png


ok,很显然,问题是来源就是对一个已经释放的对象进行release操作(这里就是HotCategoryViewController了)这样基本上可以定位出来是在哪里出现了错误,错误的对象是什么,但在很多情况下,这还不够。接下来还有一招,在concole里面通过gdb的调试命令来看下当前实例从alloc到free的整个生命周期的调用过程在concole里面敲:shell malloc_history App_PID Object_instance对应我们的例子为:2011-10-27 15:12:40.061 iAliexpress[177:707] *** -[HotCategoryViewController setTitle:]: message sent to deallocated instance 0x3a89c0这里就应该输入:shell malloc_history 177 0x3a89c0其中App_PID为当前的进程号(若你是用模拟器调试,没问题;若你是用真机调试,抱歉,你看到的进程号是手机里的,你这里拿来没用),Object_instance为该实例对象的id。回车后你会得到这样的信息
malloc-history.png 
最后,希望打印出来的信息能对你有帮助(大多数情况下能帮你定位问题)


转自:http://www.1000phone.net/thread-6921-1-2.html
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值