XCode調試技巧之EXC_BAD_ACCESS中BUG解決

本文介紹的是XCode調試技巧之EXC_BAD_ACCESS中BUG解決,如何解決,來看詳細內容。

AD:WOT2014課程推薦:實戰MSA:用開源軟件搭建微服務系統

XCode調試技巧之EXC_BAD_ACCESS中BUG解決是本文要介紹的內容,在iphone開發的時候EXC_BAD_ACCESS這個bug時不容易找到原因的,在網上找到的3個關於這個問題的方法,希望可以幫到你,我自己試了一下第一中方法,效果還不錯

首先說一下 EXC_BAD_ACCESS 這個錯誤,可以這麼說,90%的錯誤來源在於對一個已經釋放的對象進行release操作。

1. 重寫object的respondsToSelector方法,現實出現EXEC_BAD_ACCESS前訪問的最後一個object

有時程序崩潰根本不知錯誤發生在什麼地方。比如程序出現EXEC_BAD_ACCESS的時候,雖然大部分情況使用設定 NSZombieEnabled環境變量可以幫助你找到問題的所在,但少數情況下,即使設定了NSZombieEnabled環境變量,還是不知道程序崩 潰在什麼地方。那麼就需要使用下列代碼進行幫助了:

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

你需要在每個object的.m或者.mm文件中加入上面代碼,並且在 other c flags中加入-D _FOR_DEBUG_(記住請只在Debug Configuration下加入此標記)。這樣當你程序崩潰時,Xcode的console上就會準確地記錄了最後運行的object的方法。

2. 通過NSZombieEnabled

相信很多人都知道通過NSZombies來幫助調試出現EXC_BAD_ACCESS的情況,但有時還是找不到需要的信息,那麼應該怎麼辦呢?

下面通過一個例子來說明.下面是hello world的代碼:

  1. NSString* hello = [NSString stringWithFormat:@"Hello world"];  
  2. NSLog(@"What you say is %@",hello);  
  3. [hello release];  

運行後出現EXC_BAD_ACCESS錯誤.但沒有其他任何提示,這時 候通過右擊executables下的應用程序名,選擇get info後,在arguments下輸入環境變量(NSZombieEnabled,MallocStackLogging)

再次運行後程序crash,如圖:(單擊放大)

XCode調試技巧之EXC_BAD_ACCESS中BUG解決

這次可以看到問題是”message sent to dealloced object”了,但具體是哪個語句引起的還並不知道,於是需要在gdb上輸入以下語句:

  1. shell malloc_history pid address 

那麼pid和address是什麼呢?再看下crash的圖片結合一下我以下使用的命令,你應該很快就可以判定pid和address是從哪裏來的了,我的命令是:

  1. shell malloc_history 596 0×5f3ef80 

再次運行,程序crash時會出現大量的stack trace信息,如下圖是與本程序相關的:

XCode調試技巧之EXC_BAD_ACCESS中BUG解決

根據這些信息大家就可以找到問題出現在[BadAccessViewController viewDidLoad] 中與 +[NSString stringWithFormat:] 有關的地方.

最後大家記得把環境變量NSZombieEnabled,MallocStackLogging刪除或設置爲NO,因爲它們會使得內存不會被釋放.

3、設置全局斷點快速定位問題代碼所在行

XCode調試技巧–設置全局斷點快速定位問題代碼所在行[zz]

小結:XCode調試技巧之EXC_BAD_ACCESS中BUG解決的內容介紹完了,希望本文對你有所幫助!

發佈了59 篇原創文章 · 獲贊 81 · 訪問量 103萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章