转 Xcode调试技巧 EXC_BAD_ACCESS

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

6、7月之时召开的第一个iphone项目XF…,记得当时吃objc的内存管理问题折腾之一对一郁闷,经常为一个
EXC_BAD_ACCESS的问题整治届凌晨。现在稍微熟练了,不再怕内存管理,但一不注意EXC_BAD_ACCESS还是会见跳出来闹腾一下,虽然同样
般能高效缓解,但万一是发生直接的不二法门能唤起那个object的问题就是能节省成千上万休必要的时刻了。针对是问题,网上看了3单缓解方案,联合起来用效应应
该是。

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

1. 更写object的respondsToSelector方法,现实出现**EXEC_BAD_ACCESS前看的末段一个object**
(转自iPhoneGeek
爱疯狂极客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

(转自iPhoneGeek
爱疯狂极客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]

相关文章