IT门户网,专注电脑知识与技术及手机硬件信息服务网站!

当前位置:IT门户网 > 系统教程 >

iOS内存错误EXC_BAD_ACCESS的办理要领

时间:2021-09-14    来源:IT门户网    人气:

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)

iOS内存错误EXC_BAD_ACCESS的治理方式

这样,但瓦解呈现,系统会呈现以下提示信息:

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)

iOS内存错误EXC_BAD_ACCESS的治理方式

这样,当呈现瓦解原因是message sent to deallocated instance 0x7179910,我们可以利用以下呼吁,把内存地点还原:

info malloc-history 0x7179910

如图,这个呼吁能详细把这个地点在哪一行代码生成还原出来。

(需要留意的是,因为这个呼吁只支持gdb,所以必需把节制台的输出改成gdb,而且有点遗憾的是,只支持模仿器,不支持真机调试)

iOS内存错误EXC_BAD_ACCESS的治理方式

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

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

相关文章

系统教程排行榜

更多>>

网络知识排行榜

更多>>

系统教程排行榜

更多>>

服务号