App崩溃的原因(iOS)

转自点击打开链接 

作者:Matthijs Hollemans 

为了说明问题,我写了一个带Bug的Demo。

这个是Demo下载链接 : 点击打开链接 (ps:在Xcode 4.3 下写的这个demo特意留了几个bug和warming)

运行这个Demo需要在模拟器上面,在真机上也可以,只是展现的bug问题的顺序不一定一样。如图:


看吧,程序运行以后crash了。iOS 中crash主要分两种:SIGABRT(也叫EXC_CRASH) 和 EXC_BAD_ACCESS(他也可能会显示在SIGBUS或SIGSEGV下)。

SIGABRT型的crash相对容易排查,他是一种可控的crash。app在这个地方crash是因为系统识别出这非app想做的事。

而EXC_BAD_ACCESS型的crash相对难排查,因为他只在app, 通常是内存管理的问题。

可喜的是,这个Demo的是SIGABRT型的(后面还有bug,别急)。SIGABRT型的crash一般都会在Xcode的Debug输出栏(找不到Debug输出栏的同纸私聊)带有error描述(Xcode的右下方).就像下面所写:

Problems[14465:f803] -[UINavigationController setList:]: unrecognized selector sent to
instance 0x6a33840
Problems[14465:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[UINavigationController setList:]: unrecognized selector sent to instance 0x6a33840'
*** First throw call stack:
(0x13ba052 0x154bd0a 0x13bbced 0x1320f00 0x1320ce2 0x29ef 0xf9d6 0x108a6 0x1f743
0x201f8 0x13aa9 0x12a4fa9 0x138e1c5 0x12f3022 0x12f190a 0x12f0db4 0x12f0ccb 0x102a7
0x11a9b 0x2792 0x2705)
terminate called throwing an exception
这个Debug输出栏的信息很重要,他提供了非常重要的Bug发生的位置的线索,比如这句:

[UINavigationController setList:]: unrecognized selector sent to instance 0x6a33840
这条错误信息" unrecognized selector sent to instance XXX",意思是app想调用的这个方法不存在,这通常是由这个方法被错误的对象调用了。

这里的问题是UINavigationController(在内存地址为0x6a33840)调用的方法是 setList:

知道了crash引起的原因非常不错,但是你第一步要做的是找到crash发生的具体位置。



待续。。。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值