天天看點

ios 開發中 coredump 調試技巧 [1]

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

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

1

2

3

NSString * hello  =  [ NSString stringWithFormat : @ "Hello world" ];

NSLog ( @ "What you say is %@",hello );

[hello release ];

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

NSDebugEnabled

NSZombieEnabled

MallocStackLogging 

MallocStackLoggingNoCompact

ios 開發中 coredump 調試技巧 [1]

再次運作後程式crash,如圖:

ios 開發中 coredump 調試技巧 [1]

這次可以看到問題是”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資訊,如下圖是與本程式相關的:

ios 開發中 coredump 調試技巧 [1]

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

最後大家記得把環境變量NSZombieEnabled,MallocStackLogging删除或設定為NO,因為它們會使得記憶體不會被釋放.