ios开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统exc_bad_access的信息,根本没办法定位问题出现在哪里。 首先说一下 exc_bad_access 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作。举一个简单的例子来说明吧,首先看一段java代码:
(通过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)
这样,好好检查一下那一行的代码,应该就很容易找出问题所在了。
如对本文有疑问, 点击进行留言回复!!
解决Android10读取不到/sdcard/、/storage/emulated/0/文件的问题
Codeforces Round #649 (Div. 2)-B. Most socially-distanced subsequence(思维)
IOS开发教程第一季之UI进阶day2合并IOS学习013--App启动过程、多控制器管理
网友评论