遇到的問題
最近在開發一個原型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?
工具的學習依然是提高效率、降低出錯最重要的環節,由此可以節省出大量的時間。