如何調試BAD_ACCESS錯誤?

首先說一下 EXC_BAD_ACCESS 這個錯誤,可以這么說,90%的錯誤來源在于對一個已經釋放的對象進行release操作。你需要在每個object(或者用Method Swizzling自己搜方法,可以不用每個object都寫)的.m或者.mm文件中加入上面代碼,并且在 other c flags中加入-D FOR_DEBUG(記住請只在Debug Configuration下加入此標記)。這樣當你程序崩潰時,Xcode的console上就會準確地記錄了最后運行的object的方法。

#ifdef _FOR_DEBUG_  
-(BOOL) respondsToSelector:(SEL)aSelector {  
    printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);  
    return [super respondsToSelector:aSelector];  
}  
#endif 

1.重寫object的respondsToSelector方法,現實出現EXEC_BAD_ACCESS前訪問的最后一個object。
2.打開“僵尸模式”能迅速定位。有時候只會打印這樣一句:

message sent to deallocated instance 0x7ff8fdd2f9c0
//0x7ff8fdd2f9c0就是這個對象

此時可以在終端輸入以下命令來查找

輸入:sudo malloc_history 1527 0x7ff8fdd2f9c0

3.設置全局斷點快速定位問題代碼所在行。
4.Xcode 7 已經集成了BAD_ACCESS捕獲功能:Address Sanitizer。 用法如下:在配置中勾選?Enable Address Sanitizer。
5.通過instruments的Zombies。具體查看http://www.lxweimin.com/p/51188549ff06

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容