在調試程序的時候,總是碰到crash的bug,而且一追蹤就是一些匯編的代碼,讓人特別疑惑。
一般情況下可以通過增加兩天斷點來解決此問題,方法介紹如下:
基本上有錯誤分為以下幾種類型:
signal(SIGABRT, MySignalHandler);
signal(SIGILL, MySignalHandler);
signal(SIGSEGV, MySignalHandler);
signal(SIGFPE, MySignalHandler);
signal(SIGBUS, MySignalHandler);
signal(SIGPIPE, MySignalHandler);
SIGABRT和EXC_BAD_ACCESS較為特殊,算是比較好跟進。
SIGABRT是系統報錯,在memery warning之后,系統會把程序強制退出,報的就是這個錯誤。
EXC_BAD_ACCESS 大多數時候是內存提前釋放而引起的問題,或者訪問的方法不存在引起的。
追蹤程序的調用stacktrace的方法,跟蹤問題:
一般出錯了之后出現的常見界面,再熟悉不過了。。
切換到breakpoint界面,拖動底端的slider按鈕,顯示調用堆棧
雖然調用堆棧已經出來了,但是都是一堆的匯編代碼,無法給予明確的信息。。
剩下的就是今天要講的問題:添加Symbol breakpoint Exception breakpoint
Exception breakpoint添加 的添加步驟
一、Exception breakpoint 的添加。
1、切換到breakpoint 視圖界面
2、點擊最底端的"+"按鈕,添加Add Exception BreakPoint,這個就是捕獲所有的exception, 貌似stackoverflow上說,bad_access那種錯誤無法捕獲的,這個用於捕獲那些SIGSEGV 的錯誤。
3、添加完成之后的界面。
二、Symbolic breakpoint的添加
前兩步和一 基本是一樣的,不截圖了,只是在第二步選擇的時候選 Add Symbolic BreakPoint
第三步截圖;添加完成之后添加上objc_exception_throw
完成,添加完成只兩個斷點之后,程序中很多異常也可以捕獲了,直接定位到出問題的位置。
當然程序中最好也加上異常處理的代碼,可以參考這個處理,一般都是這個方式處理的
http://www.cocoachina.com/newbie/tutorial/2012/0829/4672.html