XCode調(diào)試技巧之EXC_BAD_ACCESS中BUG解決
XCode調(diào)試技巧之EXC_BAD_ACCESS中BUG解決是本文要介紹的內(nèi)容,在iphone開發(fā)的時候EXC_BAD_ACCESS這個bug時不容易找到原因的,在網(wǎng)上找到的3個關(guān)于這個問題的方法,希望可以幫到你,我自己試了一下第一中方法,效果還不錯
首先說一下 EXC_BAD_ACCESS 這個錯誤,可以這么說,90%的錯誤來源在于對一個已經(jīng)釋放的對象進行release操作。
1. 重寫object的respondsToSelector方法,現(xiàn)實出現(xiàn)EXEC_BAD_ACCESS前訪問的最后一個object
有時程序崩潰根本不知錯誤發(fā)生在什么地方。比如程序出現(xiàn)EXEC_BAD_ACCESS的時候,雖然大部分情況使用設(shè)定 NSZombieEnabled環(huán)境變量可以幫助你找到問題的所在,但少數(shù)情況下,即使設(shè)定了NSZombieEnabled環(huán)境變量,還是不知道程序崩 潰在什么地方。那么就需要使用下列代碼進行幫助了:
- #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下加入此標(biāo)記)。這樣當(dāng)你程序崩潰時,Xcode的console上就會準(zhǔn)確地記錄了最后運行的object的方法。
2. 通過NSZombieEnabled
相信很多人都知道通過NSZombies來幫助調(diào)試出現(xiàn)EXC_BAD_ACCESS的情況,但有時還是找不到需要的信息,那么應(yīng)該怎么辦呢?
下面通過一個例子來說明.下面是hello world的代碼:
- NSString* hello = [NSString stringWithFormat:@"Hello world"];
- NSLog(@"What you say is %@",hello);
- [hello release];
運行后出現(xiàn)EXC_BAD_ACCESS錯誤.但沒有其他任何提示,這時 候通過右擊executables下的應(yīng)用程序名,選擇get info后,在arguments下輸入環(huán)境變量(NSZombieEnabled,MallocStackLogging)
再次運行后程序crash,如圖:(單擊放大)
這次可以看到問題是”message sent to dealloced object”了,但具體是哪個語句引起的還并不知道,于是需要在gdb上輸入以下語句:
- shell malloc_history pid address
那么pid和address是什么呢?再看下crash的圖片結(jié)合一下我以下使用的命令,你應(yīng)該很快就可以判定pid和address是從哪里來的了,我的命令是:
- shell malloc_history 596 0×5f3ef80
再次運行,程序crash時會出現(xiàn)大量的stack trace信息,如下圖是與本程序相關(guān)的:
根據(jù)這些信息大家就可以找到問題出現(xiàn)在[BadAccessViewController viewDidLoad] 中與 +[NSString stringWithFormat:] 有關(guān)的地方.
最后大家記得把環(huán)境變量NSZombieEnabled,MallocStackLogging刪除或設(shè)置為NO,因為它們會使得內(nèi)存不會被釋放.
3、設(shè)置全局?jǐn)帱c快速定位問題代碼所在行
XCode調(diào)試技巧–設(shè)置全局?jǐn)帱c快速定位問題代碼所在行[zz]
小結(jié):XCode調(diào)試技巧之EXC_BAD_ACCESS中BUG解決的內(nèi)容介紹完了,希望本文對你有所幫助!