XCode调试技巧之EXC_BAD_ACCESS中BUG解决

移动开发 iOS
本文介绍的是XCode调试技巧之EXC_BAD_ACCESS中BUG解决,如何解决,来看详细内容。

XCode调试技巧之EXC_BAD_ACCESS中BUG解决是本文要介绍的内容,在iphone开发的时候EXC_BAD_ACCESS这个bug时不容易找到原因的,在网上找到的3个关于这个问题的方法,希望可以帮到你,我自己试了一下第一中方法,效果还不错

首先说一下 EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作。

1. 重写object的respondsToSelector方法,现实出现EXEC_BAD_ACCESS前访问的最后一个object

有时程序崩溃根本不知错误发生在什么地方。比如程序出现EXEC_BAD_ACCESS的时候,虽然大部分情况使用设定 NSZombieEnabled环境变量可以帮助你找到问题的所在,但少数情况下,即使设定了NSZombieEnabled环境变量,还是不知道程序崩 溃在什么地方。那么就需要使用下列代码进行帮助了:

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

你需要在每个object的.m或者.mm文件中加入上面代码,并且在 other c flags中加入-D _FOR_DEBUG_(记住请只在Debug Configuration下加入此标记)。这样当你程序崩溃时,Xcode的console上就会准确地记录了最后运行的object的方法。

2. 通过NSZombieEnabled

相信很多人都知道通过NSZombies来帮助调试出现EXC_BAD_ACCESS的情况,但有时还是找不到需要的信息,那么应该怎么办呢?

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

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

运行后出现EXC_BAD_ACCESS错误.但没有其他任何提示,这时 候通过右击executables下的应用程序名,选择get info后,在arguments下输入环境变量(NSZombieEnabled,MallocStackLogging)

再次运行后程序crash,如图:(单击放大)

XCode调试技巧之EXC_BAD_ACCESS中BUG解决

这次可以看到问题是”message sent to dealloced object”了,但具体是哪个语句引起的还并不知道,于是需要在gdb上输入以下语句:

  1. shell malloc_history pid address 

那么pid和address是什么呢?再看下crash的图片结合一下我以下使用的命令,你应该很快就可以判定pid和address是从哪里来的了,我的命令是:

  1. shell malloc_history 596 0×5f3ef80 

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

XCode调试技巧之EXC_BAD_ACCESS中BUG解决

根据这些信息大家就可以找到问题出现在[BadAccessViewController viewDidLoad] 中与 +[NSString stringWithFormat:] 有关的地方.

最后大家记得把环境变量NSZombieEnabled,MallocStackLogging删除或设置为NO,因为它们会使得内存不会被释放.

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

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

小结:XCode调试技巧之EXC_BAD_ACCESS中BUG解决的内容介绍完了,希望本文对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2013-04-18 10:19:40

iOS开发Xcode调试

2012-05-21 10:13:05

XCode调试技巧

2013-03-29 13:17:53

XCode调试技巧iOS开发

2011-07-20 14:31:56

XCode User Scrip 脚本

2011-08-08 17:05:02

XCode UserScript 脚本

2023-10-11 13:32:30

2014-03-12 09:52:17

XcodeCode Snippe

2011-02-22 16:09:53

Eclipse调试

2013-12-17 16:01:02

iOSXcodeInstruments

2011-07-28 14:31:55

Xcode 调试 异常

2011-08-11 16:31:08

XCode

2011-07-26 14:44:53

调试 Xcode

2013-05-20 15:04:02

Android调试查看日志Android开发

2013-04-18 09:55:56

iOS开发Xcode调试断点

2011-08-01 17:50:28

Xcode

2013-07-31 13:36:07

Windows PhoVS调试技巧Windows Pho

2010-09-02 11:03:48

CSS

2023-08-31 16:43:46

软件开发调试

2018-06-14 09:00:00

WordPress浏览器Web服务器

2011-08-19 15:16:41

XCodeUserScripts脚本
点赞
收藏

51CTO技术栈公众号