转 Xcode调试技巧 EXC_BAD_ACCESS

XCode调试技巧-纠结的EXC_BAD_ACCESS 十二月 15th, 2010

6、十十二月的时候做的首先个iphone项目XF…,记得当时被objc的内存管理问题折腾的一对一郁闷,平时为了一个
EXC_BAD_ACCESS的问题整到凌晨。现在有点熟谙了,不再害怕内存管理,但一不注意EXC_BAD_ACCESS照旧会蹦出来闹腾一下,固然一
般能便捷解决,但即使有间接的措施可以唤起那么些object的题目就能节约成千成万不需求的岁月了。针对这几个问题,网上来看了3个缓解方案,联合起来用功效应
该不错。

————————————————–纠结的分隔线————————————————–

1. 重写object的respondsToSelector方法,现实出现**EXEC_BAD_ACCESS前走访的尾声一个object**
(转自OPPOGeek
爱疯极客http://www.iphone-geek.cn/编程/分享一段代码支持拓展调剂

突发性程序崩溃根本不知错误暴发在怎么样地方。比如程序出现EXEC_BAD_ACCESS的时候,就算多数气象拔取设定
NSZombieEnabled环境变量可以辅助您找到问题的四处,但个别情状下,尽管设定了NSZombieEnabled环境变量,照旧不明白程序崩
溃在怎么样地方。那么就要求采取下列代码举行救助了:

1
2
3
4
5
6
#ifdef _FOR_DEBUG_
-(BOOL) respondsToSelector:(SEL)aSelector {
    printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);
    return [super respondsToSelector:aSelector];
}
#endif

您要求在各样object的.m或者.mm文件中进入地点代码,并且在 other c
flags中投入-D _FOR_DEBUG_(记住请只在Debug
Configuration下加入此标志)。那样当您程序崩溃时,Xcode的console上就会准确地记下了最终运行的object的方法。

————————————————–纠结的分隔线————————————————–

2.
通过NSZombieEnabled

(转自华为Geek
爱疯极客http://www.iphone-geek.cn/编程/怎么着处理exc\_bad\_accesss

信任广大人都知情通过NSZombies来增援调节出现EXC_BAD_ACCESS的情状,但偶尔仍旧找不到须求的音讯,那么应该怎么做呢?

下边通过一个例子来表明.下边是hello world的代码:

1
2
3
NSString* hello = [NSString stringWithFormat:@"Hello world"];
NSLog(@"What you say is %@",hello);
[hello release];

运转后出现EXC_BAD_ACCESS错误.但没有其余任何提醒,那时
候通过右击executables下的选择程序名,选取get
info后,在arguments下输入环境变量(NSZombieEnabled,MallocStackLogging),如图所示:

图片 1

重新运行后先后crash,如图:
图片 2

本次可以见见题目是”message sent to dealloced
object”了,但现实是哪位语句引起的还并不知道,于是需求在gdb上输入以下语句:

shell malloc_history pid address

那就是说pid和address是何等吗?再看下crash的图形结合一下我以下使用的一声令下,你应有神速就能够断定pid和address是从哪个地方来的了,我的命令是:

shell malloc_history 596 0×5f3ef80

再次运行,程序crash时会出现大量的stack
trace新闻,如下图是与本程序相关的:
图片 3

基于这几个信息我们就可以找到问题应运而生在[BadAccessViewController
viewDidLoad] 中与 +[NSString stringWithFormat:] 有关的地方.

末段大家纪念把环境变量NSZombieEnabled,MallocStackLogging删除或安装为NO,因为它们会使得内存不会被释放.

————————————————–纠结的分隔线————————————————–

3. 设置全局断点快速定位问题代码所在行

XCode调试技巧–设置全局断点飞速定位问题代码所在行[zz]

相关文章