如何定位EXC_BAD_ACCESS错误 (info malloc-history)

本文提供了解决iOS开发中遇到的EXC_BAD_ACCESS错误的方法,通过设置环境变量MallocStackLogging和NSZombieEnabled,并在出现问题时使用gdb命令定位无效对象的内存地址,从而更容易地查找并解决导致错误的根本原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 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 : exc_bad_access 根据这个信息很难判断是哪儿出了问题。
问题解决

打开可执行文件的属性: exec-get-info 打开  Executable [YourApp] Info 界面,在  Variables to be set in the enviroment 中加入以下两个环境变量,将其值设置为 YES,并确保被钩选。 MallocStackLogging NSZombieEnabled exec-info 设置完成后,再次执行前面引起 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
会得到以下输出: console-callstack 根据第10行就可以定位到创建对象的代码,这样也就容易查找 EXC_BAD_ACCESS 的问题了。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值