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環境變量,還是不知道程式崩 潰在什麼地方。那麼就需要使用下列代碼進行幫助了:
- #ifdef _FOR_DEBUG_
- -(BOOL) respondsToSelector:(SEL)aSelector {
- printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);
- return [super respondsToSelector:aSelector];
- }
- #endif
你需要在每個object的.m或者.mm檔案中加入上面代碼,并且在 other c flags中加入-D _FOR_DEBUG_(記住請隻在Debug Configuration下加入此标記)。這樣當你程式崩潰時,Xcode的console上就會準确地記錄了最後運作的object的方法。
2. 通過NSZombieEnabled
相信很多人都知道通過NSZombies來幫助調試出現EXC_BAD_ACCESS的情況,但有時還是找不到需要的資訊,那麼應該怎麼辦呢?
下面通過一個例子來說明.下面是hello world的代碼:
- NSString* hello = [NSString stringWithFormat:@"Hello world"];
- NSLog(@"What you say is %@",hello);
- [hello release];
運作後出現EXC_BAD_ACCESS錯誤.但沒有其他任何提示,這時 候通過右擊executables下的應用程式名,選擇get info後,在arguments下輸入環境變量(NSZombieEnabled,MallocStackLogging)
再次運作後程式crash,如圖:(單擊放大)

這次可以看到問題是”message sent to dealloced object”了,但具體是哪個語句引起的還并不知道,于是需要在gdb上輸入以下語句:
- shell malloc_history pid address
那麼pid和address是什麼呢?再看下crash的圖檔結合一下我以下使用的指令,你應該很快就可以判定pid和address是從哪裡來的了,我的指令是:
- shell malloc_history 596 0×5f3ef80
再次運作,程式crash時會出現大量的stack trace資訊,如下圖是與本程式相關的:
根據這些資訊大家就可以找到問題出現在[BadAccessViewController viewDidLoad] 中與 +[NSString stringWithFormat:] 有關的地方.
最後大家記得把環境變量NSZombieEnabled,MallocStackLogging删除或設定為NO,因為它們會使得記憶體不會被釋放.
3、設定全局斷點快速定位問題代碼所在行
XCode調試技巧–設定全局斷點快速定位問題代碼所在行[zz]
小結:XCode調試技巧之EXC_BAD_ACCESS中BUG解決的内容介紹完了,希望本文對你有所幫助!