iOS SIGABRT的debug方法
遇到的问题
最近在开发一个原型APP的时候,主线程SIGABRT后,crash堆栈信息非常有限,显示只crash在主线程,但是没有调用链路,所以无法定位到问题发生在哪里。
crash的堆栈信息如下图所示:
展示堆栈详细信息之后,错误的信息量依然非常低。
报错信息为一个UIButton被传了一个无法识别的方法,具体什么错误与本文无关。
调试方法
需要把XCode的调试能力完全用起来,这个时候就需要使用XCode的Exception Breakpoint功能。这样XCode会在触发异常之前自动暂停,帮助定位到crash触发原因。
设置方法非常简单,在Breakpoint Navigation栏中,点击下角的+,选择Exception Breakpoint
Exception选择All,抓全局的所有Exception可能性
然后再次运行程序,XCode自动定位到Crash程序位置,正常解bug,程序正常工作,问题解除。
致谢
Exception Breakpoint是XCode提供的传统功能,非常强大,但是藏的稍有点深,很多人找不到,导致花费大量时间debug程序,才能找到错误。可以想象,如果程序规模非常大的情况下,找到一个无堆栈的crash点的难度有多大。好些年前iOS Tutorial Team的 Matthijs Hollemans,写过一篇文章,如何在crash的时候找原因,写的非常好,虽然过去很多年了,但仍然值得读,可以参考:My App Crashed, Now What?
工具的学习依然是提高效率、降低出错最重要的环节,由此可以节省出大量的时间。