在 iphone 开发中使用内存时,我们经常会遇到 EXC_BAD_ACCESS 的错误。 出现这个错误的原因是我们访问了一个已经被释放掉的对象,如:

@implementation FeedbackViewController
- (void)viewDidLoad {[super viewDidLoad];_scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 53, 320, 389)];[self.view addSubview:_scrollView];[_scrollView release];
}
- (void)dealloc {[_scrollView release];[super dealloc];
}
@end

在上面的代码中,_scrollView 是 FeedbackViewController 中的一个数据成员。_scrollView 创建后先加入到父视图中,然后将其 release,此时 _scrollView 的引用计数应该为1,在父视图销毁时,_scrollView 会被释放掉,这正是我们期望的结果。 但是 FeedbackViewController 的 dealloc 函数中,对 _scrollView 对象又进行了一次 release,很显然这会造成对象的多次释放。 执行上面的代码,在 FeedbackViewController 退出时,[_scrollView release]; 会引起程序异常退出,且在控制台中输出 EXC_BAD_ACCESS : 根据这个信息很难判断是哪儿出了问题。


问题解决


打开可执行文件的属性: 打开 Executable [YourApp] Info 界面,在 Variables to be set in the enviroment 中加入以下两个环境变量,将其值设置为 YES,并确保被钩选。 MallocStackLogging NSZombieEnabled 设置完成后,再次执行前面引起 EXC_BAD_ACCESS 异常的步骤,这时控制台会输出如下信息:

2012-03-15 22:02:12.029 AlipayPortal[616:207] *** -[CALayer retainCount]: message sent to deallocated instance 0x14e48a40

这个输出中有个很重要的信息就是定位到了无效对象在内存中的地址,我们已经打开了 MallocStackLoggin 选项,编译器会记录该内存的分配堆栈。在控制台中输入以下命令:

(gdb) info malloc-history 0x14e48a40

会得到以下输出: 根据第10行就可以定位到创建对象的代码,这样也就容易查找 EXC_BAD_ACCESS 的问题了。

转载于:https://www.cnblogs.com/liuxingzi/archive/2012/11/13/3404248.html

如何定位EXC_BAD_ACCESS错误 (info malloc-history)相关推荐

  1. 设置 NSZombieEnabled 定位 EXC_BAD_ACCESS 错误

    http://unmi.cc/nszombieenabled-locate-exc_bad_access-error, 来自 隔叶黄莺 Unmi Blog 我们做 iOS 程序开发时经常用遇到 EXC ...

  2. linux c 用户态 调试追踪函数 调用堆栈 定位段错误

    一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的. 在glibc ...

  3. 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误

    嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报  分类: 嵌入式(928)  一般察看函数运行时堆栈的 ...

  4. 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled

    版权声明:本文为博主原创文章,未经博主允许不得转载. 我们做iOS 程序开发时经常用遇到 EXC_BAD_ACCESS 错误导致 Crash,出现这种错误时一般 Xcode 不会给我们太多的信息来定位 ...

  5. Linux内存管理内存映射以及通过反汇编定位内存错误问题

    提到C语言,我们知道C语言和其他高级语言的最大的区别就是C语言是要操作内存的! 我们需要知道--变量,其实是内存地址的一个抽像名字罢了.在静态编译的程序中,所有的变量名都会在编译时被转成内存地址.机器 ...

  6. 程序退出前的遗言----linux下利用backtrace追踪函数调用堆栈以及定位段错误

    一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的. 在glibc ...

  7. 怎么调试EXC_BAD_ACCESS错误

    当你遇到了一个EXC_BAD_ACCESS错误,我通常会给开发者几个建议: 1.在可执行选项中设置NSZombieEnabled参数,这有时会帮缩小问题的范围: 2.运行apple的内存检测工具,如  ...

  8. 使用gdb和core dump迅速定位段错误

    使用gdb和core dump迅速定位段错误 关键字:gdb.段错误.core dump 一.什么是core dump core:内存.核心的意思: dump:抛出,扔出: core dump:前提: ...

  9. 微信小程序根据sourceMap 定位代码错误位置

    这里先介绍使用微信开发者工具自带的插件定位代码错误位置. 1.下载微信开发者开发者工具(下载地址),菜单-设置-拓展设置-调试器插件 2.登录微信公众平台,下载 sourceMap文件 3.微信开发者 ...

最新文章

  1. css3 3d变换和动画——回顾
  2. HIVE 在执行大量数据JOIN的时候,容易产生内存不足的情况
  3. windows下system函数的使用
  4. C++ string 介绍
  5. android app links,Android APP Links 配置
  6. Java文档阅读笔记-Guide to the Hibernate EntityManager
  7. 某云商城发卡网源码 带视频教程
  8. 详解CSS position属性
  9. 南京大学计算机学类,南京大学计算机专业厉害吗?
  10. 如何使用计算机远程关闭手机软件,手机怎么控制电脑 手机远程控制电脑关机方法 (全文)...
  11. 视频基本原理 -视频接口之 - MIPI接口(五)
  12. Redis 报错: WRONGTYPE Operation against a key holding the wrong kind of value
  13. 在后台管理系统中如何设计账户管理?
  14. React本地化解决版本更迭出现的缓存问题
  15. layui表格 列自动适应大小失效
  16. 数据结构课程设计 校园导航系统
  17. js 实现26个字母音标速记代码
  18. linux sec是什么类型,SEC 文件扩展名: 它是什么以及如何打开它?
  19. 2020年最新 iPad Pro上的激光雷达是什么?来激光SLAM技术中找答案
  20. 表白女神专用代码(漂浮的心+手写文字效果)

热门文章

  1. 一些实用的 Javascript 代码
  2. 码农技术炒股之路——配置管理器、日志管理器
  3. VC开发Windows客户端软件之旅——前言
  4. Windows客户端C/C++编程规范“建议”——函数调用
  5. c盘扩展卷是灰色的_银行电脑win7-C盘满了怎么办
  6. 微服务项目用了几台服务器,微服务部署运维
  7. 蘑菇模拟器TV版 for Android,安卓NES模拟器TV版下载
  8. nodejs 根据坐标 标记图片上的姓名列
  9. CSS之布局(盒子的水平布局)
  10. Mac 安装多个版本jdk