ipad 开发 碰到BadAccess

 

突发性程序崩溃向不知错发生在哪儿。比如程序出现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的方法。

信任广大人数都知晓通过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,因为她会使得内存不汇合为释放.

相关文章