当程序崩溃的时候怎么办 part-1 iphone iOS

来源:互联网 发布:蒲公英刷商务通软件 编辑:程序博客网 时间:2024/04/29 17:47

http://article.ityran.com/archives/1006

看完了,一边看,一边把自己看的过程记录下来,算是摘要吧,以后回头查也方便。前两天看了两本翻译的很坑爹,但是经典的入门书籍,那个痛苦啊,真是糟蹋好书了。这篇文章翻译的不错,因为我比较懒,看e文比较比较累。有兴致的话,还是看原汁原味的e文比较好。发现这是一个很好的学习方法,以前看到一篇文章不错,但是没看下去,后面也就不了了之了。现在我把它放到这里,想看的时候就看一下,边看还可以把自己的想法和看的过程写出来。心里挺舒服的。

之前一直觉得XCode调试功能,没有vs方便,有些变量看个值,还非得打印出来。为了价格nslog,整个程序都得重新走一遍 。看来是自己了解的不够深入,虽然现在没有发现,但是应该会有比较好的办法。

两种最基本的crash类型 
1.
SIGABRT(也叫EXC_CRASH)

SIGABRT是一个比较好解决的,因为他是一个可掌控的crash。App会在一个目的地终止,因为系统意识到app做了一些他不能支持的事情。

2.EXC_BAD_ACCESS(也可能会是SIGBUS或者SIGSEGV)

EXC_BAD_ACCESS是一个比较难处理的crash了,当一个app进入一种毁坏的状态,通常是由于内存管理问题而引起的时,就会出现出现这样的crash。


对错误的解读,后面这个是所谓的对象的内存地址

[UINavigationController setList:]: unrecognized selector sent to instance 0x6a33840

“unrecognized selector sent to instance XXX” 这条错误消息意味着你的app正在试着执行一个不存在的方法。这种情况的发生,主要是都是一个方法被错误的对象调用了(也就是这个对象没有这个方法,但是你调用了他,就错了)。例如在这里这个问题上,对象就是UINavigationController (在内存地址0x6a33840上),方法就是setList:。

学了个小技巧,调试导航,Debug Navigator(调试导航),以前还真不会用这个,惭愧啊。它将会展示出崩溃时全部的堆栈信息。搞不明白的是为什么Xcode这么喜欢把汇编给程序员看,调试的时候下一步也经常出现这种汇编。

又学了个小技巧,Breakpoint Navigator(断点导航器),Add Exception Breakpoint。

接下来这段错误的分析很精彩


一个和内存相关的崩溃一般很难定位到源代码,因为这个恶魔可能很早就在程序中做了坏事了。假如一段有问题的代码混乱了内存结构,这样产生的蝴蝶效应可能会在之后很久才表现出来,并且总在不同的地方。

实际上,在你所有的测试中,这个bug可能永远不会出现,但是却在你的客户的设备上展露出它丑陋的脑袋。这种是很多人都不想的。


太神奇了,你可能需要点击好几次才可以,然后你将会得到错误消息。还有这种事情.

错误消息显示这个方法的名字是buttonTapped,但是MainViewController的方法却是buttonTapped:(注意冒号),由于这个方法需要接受一个参数(名字是sender),所以在方法名字后面有个冒号。从这个错误消息看出,这个方法没有冒号,因此不需要参数。

看到这里,我中枪了。继续

这个c类型字符串的图,真的很形象。



“po”命令是“print object”(打印对象)的简写。“$eax”是cup的一个寄存器。在一个异常的情况下,这个寄存器将会包含一个异常对象的指针。注意:$eax只会在模拟器里面工作,假如你在设备上调试,你将需要使用”$r0″寄存器。

例如,假如你输入:

(lldb) po [$eax class]

你将会看像这样的东西:

(id) $2 = 0x01446e84 NSException

这些数字不重要,但是很明显的是你正在处理的NSException对象在这里。

你可以对这个对象调用任何方法。例如:

(lldb) po [$eax name]

这个将会输出这个异常的名字,在这里是NSInvalidArgumentException,并且:

(lldb) po [$eax reason]

这个将会输出错误消息:

(unsigned int) $4 = 114784400 Receiver () has nosegue with identifier 'ModalSegue'

注意:当你仅仅使用了“po $eax”,这个命令将会对这个对象调用“description”方法和打印出来,在这个情况下,你也会得到错误的消息。

原创粉丝点击