`

XCode调试技巧之EXC_BAD_ACCESS中BUG解决

阅读更多

http://mobile.51cto.com/iphone-279455.htm

 

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解决的内容介绍完了,希望本文对你有所帮助!


分享到:
评论

相关推荐

    查找 EXC_BAD_ACCESS 问题根源的方法

    EXC_BAD_ACCESS 错误是 Objective-C 开发中常见的挑战之一。通过本文提供的示例分析和技术建议,希望能够帮助开发者们更有效地定位和解决此类问题。记住,关键是要理解对象的生命期管理以及正确使用内存管理机制,...

    查找EXC_BAD_ACCESS的错误代码处

    为了有效地解决问题并提高应用的稳定性,开发者需要掌握一种有效的调试技巧——使用Xcode内置的Instrument工具来定位和修复`EXC_BAD_ACCESS`错误。 #### 二、Instrument工具简介 Instrument是Xcode集成开发环境中...

    ios EXC_BAD_ACCESS错误调试

    在iOS开发中,EXC_BAD_ACCESS错误是一种常见的运行时错误,通常是因为程序尝试访问已被释放的内存地址导致的。当程序尝试访问一个已经释放的对象时,系统就会抛出EXC_BAD_ACCESS错误,这在C语言中通常被理解为使用了...

    关于出现僵尸信号SIGBAT或者EXC_BAD_ACCESS的解决方案

    标题中的“僵尸信号SIGABRT或EXC_BAD_ACCESS”是iOS开发中常见的错误类型,主要与内存管理和对象生命周期有关。这两个错误通常出现在Objective-C或Swift编程中,涉及到内存泄漏、过早释放对象或者试图访问已经释放的...

    iOS内存错误EXC_BAD_ACCESS的解决方法

    在iOS开发中,遇到“EXC_BAD_ACCESS”错误是一个常见的挑战,这种错误通常与内存管理问题有关,尤其是对象的过度释放或访问已被释放的内存。本文将深入探讨如何解决这类问题。 首先,理解“EXC_BAD_ACCESS”错误的...

    Xcode_7.3.1_GM_Seed的DeviceSupport文件夹

    文件目录Xcode_7.3.1_GM_Seed.dmg\5.hfs\Xcode\Xcode.app\Contents\Developer\Platforms\iPhoneOS.platform\DeviceSupport,从新发布的Xcode_7.3.1_GM_Seed.dmg镜像中提取

    xcode_3.2.6_and_ios_sdk_4.3_beta.dmg.zip

    这个名为"xcode_3.2.6_and_ios_sdk_4.3_beta.dmg.zip"的压缩包文件,包含了Xcode 3.2.6的完整安装程序和iOS 4.3 Beta的软件开发工具,对于研究和理解早期iOS开发历史具有重要价值。 首先,Xcode是苹果官方的集成...

    Xcode调试技巧总结

    ### Xcode调试技巧详解 #### 一、Xcode调试工具概览 Xcode作为iOS开发者常用的集成开发环境,提供了丰富的调试工具。其中最重要的包括编译器、调试器等。 - **GCC (GNU Compiler Collection)**: 是一套开源的...

    XCode_3_2_6.种子

    chinamac.com-XCode_3_2_6.torrent 是一个种子文件,可迅雷下载

    Apple_Xcode_8.3.3_for_for_macOS_10.12_and_later.part5_Downloadly.ir.rar

    Apple_Xcode_8.3.3_for_for_macOS_10.12_and_later.part5_Downloadly.ir.rar

    xcode_4.2_and_ios_5_sdk_for_snow_leopard.dmg的torrent文件

    利用这个torrent文件,使用迅雷进行下载xcode_4.2_and_ios_5_sdk_for_snow_leopard.dmg , 在虚拟机的苹果电脑中进行安装xcode

    xcode4.2_ios5_sdk_for_lion

    在这个案例中,"xcode_4.2_and_ios_5_sdk_for_lion.dmg"是实际的安装文件,包含了完整的Xcode 4.2和iOS 5 SDK,用户可以通过双击这个.dmg文件将其挂载到Lion系统上,然后进行安装。 总的来说,这个压缩包文件提供了...

    XCode 4.2 + iOS5 SDK for Snow Leopard/Lion 网络绝版!

    Snow Leopard 上最后一个版本的xcode 网络上已经没有其他可下载的资源点 xcode_4.2_and_ios_5_sdk_for_snow_leopard.dmg xcode_4.2_and_ios_5_sdk_for_lion.dmg md5:4e0efebe696d31b46ab4b117015515a5

    xcode_6_beta_7.dmg下载百度云地址

    "Xcode_6_beta_7.dmg.txt"可能是一个文本文件,其中包含有关如何下载或访问Xcode 6 Beta 7的详细信息,比如百度云的链接或提取码。在实际开发过程中,这种文件通常用于分享大型软件包,因为它们的大小可能超过电子...

    二维码开源库ZXing加入xcode工程问题的解决_ios

    二维码开源库ZXing加入xcode工程问题的解决_ios ios开发技巧整理

    XCode_Debug.zip_xcode

    《Xcode调试技巧详解》 Xcode作为Apple官方的集成开发环境(IDE),是iOS、macOS以及其他Apple平台应用开发的重要工具。对于开发者而言,掌握Xcode的调试技能至关重要,它能够帮助我们深入理解代码执行过程,定位并...

    Additional_Tools_for_Xcode_12.dmg

    Additional_Tools_for_Xcode_12,适用于安装macOS Xcode附加应用

    Command_Line_Tools_for_Xcode_11.4.dmg

    Xcode Command Line Tools, 安装Homebrew必备,无法使用命令安装时可用安装包安装

    Additional_Tools_for_Xcode_11.4.dmg

    Additional_Tools_for_Xcode_11.4,适用于安装macOS Xcode附加应用

    Apple_Xcode_Mac_9.4.1_Build_9Q1019a_Stable_macOS.part6_Downloadly.ir.rar

    Apple_Xcode_Mac_9.4.1_Build_9Q1019a_Stable_macOS.part6_Downloadly.ir.rar

Global site tag (gtag.js) - Google Analytics