有时候,你会遇到由EXCBADACCESS造成崩溃。 这篇文件会告诉你什么是EXCBADACCESS,以及它产生的原因。我还会提供一些EXCBADACCESS错误的解决方案。

1. 什么是 EXCBADACCESS?

一旦你理解EXCBADACCESS的本质,你就会更好地理解其这个模糊的名称。这里有一个极为简单的解释,也有一个技术层面解释。我们首先从简单的解释开始说起。

2.保持简单

不管什么时候当你遇到EXCBADACCESS这个错误的时候,那就意味着你向一个已经释放的对象发送消息。这是最常见的情况,但也有例外,我们将在稍后讨论。

3. EXCBADACCESS的本质

技术层面的解释有些复杂。在C和Objective-C ,你是一直在处理指针。指针无非是存储另一个变量的内存地址的变量。当您向一个对象发送消息时,指向该对象的指针将会被引用。这意味着,你获取了指针所指的内存地址,并访问该存储区域的值。

当该存储器区域不再映射到您的应用程序,或者换句话说,该内存区域在你认为使用的时候却没有使用的时候 ,该内存区域是无法访问的。 这时内核抛出一个异常( EXC ),表明你的应用程序不能访问该存储器块(BAD ACCESS) 。

总之,当你碰到EXCBADACCESS ,这意味着你试图发送消息到的内存块,但内存块无法不执行该消息。但是,在某些情况下, EXCBADACCESS是由被损坏的指针引起的。每当你的应用程序尝试引用损坏的指针,一个异常被内核抛出抛出。

4.调试EXCBADACCESS

调试EXCBADACCESS可能会非常棘手和令人沮丧的。然而,现在EXCBADACCESS不再是你一个谜,它没有想象中的那么可怕。 你需要知道的第一件事是您的应用程序并不一定是在崩溃的那一刻,您的应用程序不可访问内存区域。这就是常使调试EXCBADACCESS如此困难的原因。 同样受损指针也是如此。您的应用程序不会崩溃,因为指针走被损坏时。同时,如果您在应用程序来回传递一个受损的指针也不会崩溃。当应用程序试图引用受损指针的时候,就会发生奔溃。

5.僵尸调试模式

僵尸调试模式在过去几年中得到了普及,事实上它们已经出现在Xcode上超过十年。僵尸听起来有点戏剧性,但它实际上是为将帮助我们调试EXCBADACCESS功能而取得一个伟大的名字。让我来解释它是如何工作的。

在Xcode中,您可以启用僵尸对象,这意味着被释放的对象将会以僵尸的形式被保留。换言之,保留释放的对象就是为了调试。这里没有涉及任何魔法。如果您向僵尸对象发送消息时,你的应用程序将会由于EXCBADACCESS而崩溃。

这是为什么有好处吗?让EXCBADACCESS难以调试的原因是,你不知道你的应用程序试图访问哪个对象。僵尸对象在许多情况下解决这个问题。通过保留已释放的对象,Xcode可以告诉你你试图访问哪个对象,这使的查找问题原因容易得多。

在Xcode中启用僵尸是很容易的。注意,这可能会因的Xcode的版本而不同的。以下方法适用于Xcode的6和7,单击左上角的Edit Scheme,并选中Edit Scheme。 在左侧选中Run ,在上方打开 Diagnostics选项。要启用僵尸对象,勾选 Enable Zombie Objects选框。

如果你现在遇到EXCBADACCESS ,在Xcode的控制台输出,告诉你该从哪里查找问题。看看下面的例子输出。

2015-08-12 06:31:55.501 Debug[2371:1379247] -[ChildViewController respondsToSelector:] message sent to deallocated instance 0x17579780

在上面的例子中, Xcode告诉我们, respondsToSelector的消息:被发送到送到一个僵尸对象。然而,僵尸对象不再是ChildViewController类的一个实例。以前分配给ChildViewController实例的内存区域不再映射到您的应用程序。这为你了解的问题产生的根本原因提供一个不错的建议。

不幸的是,僵尸对象将无法保存您的一天每次崩溃的EXCBADACCESS的记录。既然僵尸对象没有这些伎俩,那么你可以采取其他的方法进行一些适当的分析。

6.分析

如果僵尸对象不能解决你的问题,那么问题的根源可能就不那么简单了。在这种情况下,您需要仔细看看在应用程序崩溃时执行的代码。这可能是繁琐和耗时的。 为了帮助你发现你的代码的问题,你可以使用Xcode来分析你的代码,帮助你找到出现问题的地方。注意,Xcode分析项目,它会指出每一个潜在的可能出现的问题的地方。 使用Xcode来分析你的项目,从Xcode的 Product菜单选择 Analyze或按 Shift-Command-B.Xcode的将需要片刻的时间,但是当它完成的时候你会在左边的  Issue Navigator看到问题列表。由分析发现的问题用蓝色高亮显示。 

当你点击一个问题,Xcode的会指向问题代码块,这些正是你要的注意的地方。注意,Xcode仅仅是建议。在某些情况下,这是可能的,问题是不相关的,不固定。

 如果你找不到造成EXCBADACCESS的错误,那就需要你仔细审视Xcode项目,分析其中发现的每一个问题。

7.结论

EXCBADACCESS是开发者面临的一个共同的问题,它是手动内存管理固有的问题。虽然推行ARC内存管理方式 (自动引用计数)使得EXCBADACCESS没那么频繁,但他们并没有真正的消失。

EXC_BAD_ACCESS调试的更多相关文章

  1. EXC_BAD_ACCESS的本质详解以及僵尸模式调试原理

    原文:What Is EXC_BAD_ACCESS and How to Debug It 有时候,你会遇到由EXC_BAD_ACCESS造成的崩溃. 这篇文章会告诉你什么是EXC_BAD_ACCES ...

  2. iOS 调试 crash breakpoint EXC_BAD_ACCESS SIGABRT

    原文地址:iOS 调试 crash breakpoint EXC_BAD_ACCESS SIGABRT作者:流年若离殇 在调试程序的时候,总是碰到crash的bug,而且一追踪就是一些汇编的代码,让人 ...

  3. iOS 内存错误调试(EXC_BAD_ACCESS)

    内存错误crash现场: Thread堆栈: 有可能是访问被释放对象造成,根据现场并不能找到具体哪个对象出现内存错误. 1.开启僵尸对象调试 Edit Scheme->Debug->Dia ...

  4. 怎么调试EXC_BAD_ACCESS错误

    当你遇到了一个EXC_BAD_ACCESS错误,我通常会给开发者几个建议: 1.在可执行选项中设置NSZombieEnabled参数,这有时会帮缩小问题的范围: 2.运行apple的内存检测工具,如  ...

  5. Xcode崩溃问题调试 signal SIGABRT&EXC_BAD_ACCESS

    在进行app开发过程中会遇到很多的问题,各种崩溃令人相当头疼.当然,解决bug的能力也体现了一个程序员的水平,现在来说一说开发中经常遇到的崩溃问题吧. 常见崩溃问题: 一是signal SIGABRT ...

  6. Xcode调试之exc_bad_access以及 message sent to deallocated instance

    如果出现exc_bad_access错误,基本上是由于内存泄漏,错误释放,对一个已经释放的对象进行release操作.但是xcode有时候不会告诉你错误在什么地方(Visual Studio这点做得很 ...

  7. EXC_BAD_ACCESS(code...)坏内存访问 调试

    一般很多人遇到这个 都会崩溃 断点一般 找不到 原因 :  只能按照一步一步走readView的模式 : 一般是问题是  相互包含 比如  view2 在view1 上  但是在view2 又创建了一 ...

  8. iOS 性能调试

    性能调优的方式: 1.通过专门的性能调优工具 2.通过代码优化 1. 性能调优工具: 下面针对iOS的性能调优工具进行一个介绍: 1.1 静态分析工具–Analyze 相信iOS开发者在App进行Bu ...

  9. Xcode7中你一定要知道的炸裂调试神技

    转自:http://www.cocoachina.com/ios/20151020/13794.html Xcode7中苹果为我们增加了两个重要的debug相关功能.了解之后觉得非常实用,介绍给大家. ...

随机推荐

  1. 详解环境搭建SSM

    1.概述: SSM即为spring 4 +spring mvc +mybatis 3.4.6 推荐使用maven或者gradle 来配置 下面给出maven配置方式 2.项目结构: 新建web项目 这 ...

  2. 15.更新和删除数据--SQL

    一.更新数据 更新(修改)表中的数据,可以使用UPDA TE语句.有两种使用UPDA TE的方式: 更新表中的特定行: 更新表中的所有行. 警告:不要省略WHERE子句 在使用UPDA TE时一定要细 ...

  3. P2152 [SDOI2009]SuperGCD

    传送门 非常显du然liu的一道题 就是求GCD 因为数据范围... 所以要上压位高精+非递归的辗转相减 关于辗转相减: 如果 A是二的倍数,B是二的倍数   那么GCD(A,B)=2 * GCD(A ...

  4. Vue --6 router进阶、单页面应用(SPA)带来的问题

    一.Vue-router进阶 回顾学过的vue-router,并参考官方文档学习嵌套路由等路由相关知识. 二.单页面应用(SPA)带来的问题 1.虽然单页面应用有优点,但是,如果后端不做服务器渲染(h ...

  5. 前端JavaScript(3)-关于DOM操作的相关案例,JS中的面向对象、定时器、BOM、位置信息

    小例子: 京东购物车 京东购物车效果: 实现原理: 用2个盒子,就可以完整效果. 先让上面的小盒子向下移动1px,此时就出现了压盖效果.小盒子设置z-index压盖大盒子,将小盒子的下边框去掉,就可以 ...

  6. PartTime_网址_内

    http://www.360doc.com/content/15/0930/12/28012971_502432950.shtml 2015所有适合程序员接私活的网站 请把 @ 换成 . 猪八戒    ...

  7. 转 AIX filesystemcache引发的Oracle事故

    http://blog.itpub.net/26015009/viewspace-1806629/

  8. Python网络编程中的服务器架构(负载均衡、单线程、多线程和同步、异步等)

    这篇文章主要介绍服务器架构. 网络服务需要面对两个挑战. 第一个问题是核心挑战,要编写出能够正确处理请求并构造合适响应的代码. 第二个挑战是如何将网络代码部署到随系统自动启动的Windows服务或者是 ...

  9. Java学习知识体系大纲梳理

    感悟 很奇怪,我怎么会想着写这么一篇博客——Java语言的学习体系,这不是大学就已经学过的课程嘛.博主系计算机科班毕业,大学的时候没少捧着Java教程来学习,不管是为了学习编程还是为了期末考个高分,都 ...

  10. python基础---有关nparray----切片和索引(一)

    Numpy最重要的一个特点就是其N维数组对象,即ndarray,该对象是一种快速而灵活的大数据集容器,实际开发中,我们可以利用这种数组对整块数据执行一些数学运算. 有关ndarray,我们就从最简单的 ...