NSZombieEnabled调试EXC_BAD_ACCESS的原理
来源:互联网 发布:琴歌指弹淘宝 编辑:程序博客网 时间:2024/06/17 06:45
另外两个好的帖子:http://www.cnblogs.com/likwo/archive/2011/02/28/1967066.html
http://www.cnblogs.com/jqyp/archive/2012/02/03/2337335.html
更新Xcode 4设置NSZombieEnabled方法:
按住Option点Run按钮,在出现的窗口中选择Arguments,在Environment Variables里面添加NSZombieEnabled,Value下面添YES
用nszombieenabled解决恼人的exc_bad_access错误
以下为XCode 3的设置方法
这个方法也许很多人都知道了,但是毕竟有不知道的,比如在写这篇文章之前10分钟的我。先说明情况:昨天遇到了这样的问题,程序突然Crash,出现EXC_BAD_ACCESS错误,但是不是每次都Crash,有几次RP高了就好使,Debug时最终基本停在objc-msgsend这里,但也不是每次,是大部分(90%)。十分令人费解,搞了几个小时无果,求助google和stackoverflow终于解决。
首先解释下EXC_BAD_ACCESS,当你向已经释放的对象发送消息时就会出现这种错误。
至于NSZombieEnabled,就是当设置NSZombieEnabled环境变量后,一个对象销毁时会被转化为_NSZombie,个人感觉和线程的那几个状态有些相似,设置NSZombieEnabled后,当你向一个已经释放的对象发送消息,这个对象就不会向之前那样Crash或者产生一个难以理解的行为,而是放出一个错误消息,然后以一种可预测的可以产生debug断点的方式消失(原文是die),因此我们就可以找到具体或者大概是哪个对象被错误的释放了。
设置NSZombieEnabled的方法如下
- 在XCode左边那个Groups & Files栏中找到Executables,双击其中的一项,或者右键Get Info;
- 切换到Arguments
- 这里一共有两个框,在下面那个Variables to be set in the environment:点+号添加一项,Name里填NSZombieEnabled,Value填Yes,要保证前面的钩是选中的。
好了,赶紧去找哪里出了问题吧,至于取消NSZombieEnabled,就是吧刚才提到的那个钩取消即可。
最后总结一下感想,首先是我对EXC_BAD_ACCESS这个错误还没有足够的认识,其次是我没有尽快的去搜索一下解决方法,这两点导致我浪费了大量时间做各种各样奇怪的调试。幸好现在解决了,可以继续工作了。
2012.02.15更新:
在debug过程中,你可能发现启用NSZombieEnabled后,程序不再crash,而一旦去掉NSZombieEnabled,程序再次crash。此时NSZombieEnabled已经无法解决你的问题,只能遵照内存管理原则仔细查找问题出处,至于这种问题的产生原因,个人认为可能是NSZombieEnabled在一定程度上延长了一个object的生命周期,而延长的这段时间恰好突破了EXC_BAD_ACCESS的临界点,从而避免了EXC_BAD_ACCESS的发生。
- NSZombieEnabled调试EXC_BAD_ACCESS的原理
- EXC_BAD_ACCESS之NSZombieEnabled以及全局断点调试
- EXC_BAD_ACCESS之NSZombieEnabled以及全局断点调试
- 开发笔记 - 设置NSZombieEnabled调试EXC_BAD_ACCESS
- ios 调试技巧收藏 一 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled
- ios 调试技巧收藏 一 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled
- ios 调试技巧收藏 一 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled
- 用NSZombieEnabled解决恼人的EXC_BAD_ACCESS错误
- 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled
- 用NSZombieEnabled解决恼人的EXC_BAD_ACCESS错误
- 用NSZombieEnabled解决恼人的EXC_BAD_ACCESS错误
- 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled
- 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled
- 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled
- 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled
- 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled
- 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled
- 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled
- 详解几个常见的语音编解码标准
- 一段关于Python字典遍历的“争论”
- android工程版本的改变
- mysql 子查询与join性能比较
- 深入理解JavaScript Hijacking原理
- NSZombieEnabled调试EXC_BAD_ACCESS的原理
- asp 页面 显示地图
- 一篇帮助理解git rebase的好文章 ( by quqi99 )
- 英特尔杯作品 2010年一等奖作品摘要
- 测试用例设计方法
- sqlit3 学习笔记
- Subsonic使用
- HttpClient 学习整理
- 最长数字和的自串