iOS内存错误EXC

  iOS开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统EXC_BAD_ACCESS的信息,根本没办法定位问题出现在哪里。 首先说一下 EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作。举一个简单的例子来说明吧,首先看一段Java代码:

  public class Test{

  public static void main(String[] args){

  String s = “This is a test string”;

  s = s.substring(s.indexOf(“a”),(s.length()));

  System.out.println(s);

  }

  }

  通常这样的崩溃出现,原因一般就是:调用了已经释放的内存空间,或者说重复释放了某个地址空间。而怎样定位到这个地址呢,可以通过编辑xcode的scheme,添加如下标记位,让系统把错误地址打印出来,如图:

  (通过Product->Scheme->Edit Scheme进入下面编辑页面,选中Arguments tab,增加标计位NSZombieEnabled设为YES)


  这样,但崩溃出现,系统会出现以下提示信息:

  2013-06-23 00:45:20.479 *** -[__NSArrayM addObject:]: message sent to deallocated instance 0x7179910

  可见崩溃原因是内存地址0x7179910被重复释放了。

  Objective-C 这段代码有三个致命问题:1、内存泄露;2、错误释放;3、造成 EXC_BAD_ACCESS 错误。

  如果崩溃是发生在当前调用栈,通过上面的做法,系统就会把崩溃原因定位到具体代码中。但是,如果崩溃不在当前调用栈,系统就仅仅只能把崩溃地址告诉我们,而没办法定位到具体代码,这样我们也没法去修改错误。这时就可以修改scheme,让xcode记录每个地址alloc的历史,这样我们就可以用命令把这个地址还原出来。如图:(跟设置NSZombieEnabled一样,添加MallocStackLoggingNoCompact,并且设置为YES)


  这样,当出现崩溃原因是message sent to deallocated instance 0x7179910,我们可以使用以下命令,把内存地址还原:

  info malloc-history 0x7179910

  如图,这个命令能具体把这个地址在哪一行代码生成还原出来。


  (需要注意的是,因为这个命令只支持gdb,所以必须把控制台的输出改成gdb,并且有点遗憾的是,只支持模拟器,不支持真机调试)


  (同样是通过Product->Scheme->Edit Scheme进入上面编辑页面,选中Info tab)

  这样,好好检查一下那一行的代码,应该就很容易找出问题所在了。

时间: 2024-08-18 10:42:48

iOS内存错误EXC的相关文章

iOS内存错误EXC_BAD_ACCESS的解决方法_IOS

iOS开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统EXC_BAD_ACCESS的信息,根本没办法定位问题出现在哪里. 首先说一下 EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作.举一个简单的例子来说明吧,首先看一段Java代码: 复制代码 代码如下: public class Test{ public static void main(String[] args){ String s = "

ios-关于iOS内存释放问题,求解答

问题描述 关于iOS内存释放问题,求解答 我的类如下: 头文件: #import "BmobDanmaku.h" @interface BmobBubbleDanmaku : BmobDanmaku @property NSMutableArray *listData; @property UITableView *tableView; @property UITableViewCell *tableViewCell; -(instancetype)init; @end 实现文件: /

VS调用dll出现内存错误

问题地址:http://q.cnblogs.com/q/34732/ 描述: 出现了内存错误,向dll里传递了一个vector,dll向vector放了一点数据,程序退出的时候有内存错误. 解答: vector的本质就是一个变长数组,数据存储是在堆上的,在dll中存入数据,很可能就是在dll中申请的存储,在主程序里面释放的存储.如果你的程序采用静态链接的方式,每一个可执行模块都会创建自己的CRT堆,在模块内部进行new和delete操作的时候,是在CRT堆上进行的,这样不会出错,但是如果在dll

pyqt-求问一个PyQt的问题,退出时候内存错误

问题描述 求问一个PyQt的问题,退出时候内存错误 1C 写了一个pyqt的程序,有多个tab页,其中一个tab页是通过matplotlib画图,当这个模块存在时,整个程序在退出的时候就会出现exit code -1073741819,这个是出现了内存错误.但是当我去掉这个模块时,程序不会出现这个问题.而且当我把其他的tab页注释掉,仅仅只有这模块的时候,也不会出问题.这说明,这应该是这个模块与其他的某个模块导致了问题. 于是我一个模块一个模块的注释,想找到到底哪个模块与这个画图的模块同时会导致

电脑打开程序出错显示0x57a03521内存错误该怎么办?

  1.我们在系统开启时候,桌面就会弹出一个0x57a03521内存错误提示框出来,如果没有很大程度上影响我们的操作.我们一般只需要选择取消按钮就可以了. 2.像小编的这台电脑,发现的原因竟然是WPS和office冲突造成的,一般来说,像这样办公软件,我们选择一款酒够了,没有必要同一类型的要安装两款软件,一是容易造成软件冲突,二呢会增加我们系统的负担,选择卸载一款就行了. 3.可以选择用360卫士中的系统急救箱来进行解决.这样,他也会给你慢慢进行修复. 4.都还不行的话,只有用运行工具进行扫描检

win7系统安装应用程序提示“0x009c423内存错误”怎么解决

win7系统安装应用程序提示"0x009c423内存错误"怎么解决 1.原因竟然是WPS和office冲突造成的,一般来说,像这样办公软件,我们选择一款就够了,没有必要同一类型的要安装两款软件,一是容易造成软件冲突,二呢会增加我们系统的负担,选择卸载一款就行了. 2.可以选择用360卫士中的系统急救箱来进行解决. 3.都还不行的话,只有用运行工具进行扫描检查扫描了,他会主动找到错误项,扫描完成后重启就基本上完成了.运行---输入cmd---输入for %1 in (%windir%sy

系统出现内存错误怎么办

  使用Windows操作系统的人有时会遇到这样的错误信息:"0X????????指令引用的0x00000000内存,该内存不能written",然后应用程序被关闭.其实,这个错误并不一定是Windows不稳定造成的. 系统出现内存错误的解决方法: 1.应用程序没有检查内存分配失败 程序需要一块内存用以保存数据时,就需要调用操作系统提供的"功能函数"来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存.这就是

内存错误导致蓝屏

  在电脑出现蓝屏的情况原因有很多,其中内存错误也是比较常见的原因.如果是内存错误,蓝屏的代码会提示0×0000001A. 内存管理错误大多是由于硬件的原因引起,比如在新硬件安装后,或者内存本身就有问题.如果是在安装了Windows的时候出现的,也可能是由于电脑不能达到安装Windows的最小内存和磁盘要求等原因造成的.

iOS内存管理和malloc源码解读

最近由于排查问题,顺便对iOS的内存管理,尤其是malloc库稍微深入地了解一下,在这里整理出来,和大家分享一下. 0. iOS内存基本原理 在接触iOS开发的时候,我们都知道"引用计数"的概念,也知道ARC和MRR,但其实这仅仅是对堆内存上对象的内存管理.用WWDC某Session里的话说,这其实只是内存管理的冰山一角. 在内存管理方面,其实iOS和其它操作系统总体上来说是大同小异的,大的框架原理基本相似,小的细节有所创新和不同. 和其它操作系统上运行的进程类似,iOS App进程的