Xcode常见的程序崩溃及其调试
这个画面是不是很熟悉?
两种常见crash:SIGABRT以及EXC_BAD_ACCESS
SIGABRT是可控的crash,因为系统知道应用出现了一些不该出现的错误比如
这些信息中有一些给出了错误的线索,比如
“unrecognized selector sent to instance XXX” 这样的错误意味着,程序调用了不存在的方法,即某个对象没有该方法,而你却用该方法向其发送消息。
EXC_BAD_ACCESS,调试起来比较困难,由于内存管理问题,app出现了一些错误的状态。
首先得知道问题出在哪,为了解决这个问题,你可以使用调用栈(也叫栈轨迹或者回溯)。当程序崩掉时,会出现如下图,Xcode(会自动切换到Debug导航栏)
如图,它会显示所有处于活动状态的线程,在崩掉的线程处会有高亮显示,如上图的14 main。通常情况下它会在线程1(Thread1 程序的主线程)崩掉,因为大部分工作都是在主线程上完成的,当然,如果你用到队列或者后台线程,App同样会在其他线程崩掉。
如上图,高亮显示在main.m里面的main函数,但是main函数没有提供有用的信息,所以我们需要进一步挖掘出有用的信息。你可以滑到Debug导航栏的底部,将底部的滑杆推到最右边。它会显示崩溃时的调用栈。如下图所示
调用栈将会显示当前处于活动状态的函数或者方法,由于崩溃,调试器(debugger)暂停了程序,相应得所有的方法和函数也就被冻结了。底部的start方法(main下面)首先被调用,它会调用main函数,即一个应用的入口函数,main函数通常位于调用栈的底部。Main函数会调用UIApplicationMain方法,也就是在main函数中被高亮显示的那一行即