在LLDB下排查message sent to deallocated instance問題

最近在用MRC做一個測試項目,因爲第一次用MRC,所以出現了很多問題,當我在用Analyze分析之後,就跟着它的提示改了,改了之後程序一運行就crash了,百度了之後才知道原來Xcode的Analyze也只是提示而已,並不一定是正確的。在出現內存泄露之後,我就各種百度,終於是找到LLDB下的解決方案。我看了很多都是gdb下的,但是Xcode7裏面直接是LLDB的。不過終於找到了,測試過,但是沒有測出來具體問題在哪裏,不過這個方法還是挺有效的。

在XCode的以前版本中,如果遇到了

message sent to deallocated instance 0x6d564f0

我們可以使用info malloc-history 0x6d564f0來查看調用堆棧來查看崩潰發生的地方,這種方法這裏不作闡述,大家自行百度。

在新的XCode裏,調試器默認使用LLDB,我就講一下如何在LLDB狀態下定位到由於內存操作不當引起的Crash
首先我有一段會發生崩潰的代碼:
NSString *themePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:themePathTmp];

if(themePath)
  self.backgroundIV.image = [UIImage imageWithContentsOfFile:[themePath stringByAppendingPathComponent:@"mask_1.png"]];

[themePath release];
學過內存管理的人都應該知道在這裏themePath並沒有被retain,所以如果寫了release,那麼必然會發生崩潰情況。首先我們需要對開發的環境變量進行設置


運行代碼,出現下面的崩潰現象

下面我們打開“活動監視器”,找到我們對應的PID,我們的Target爲HPThemeManager,只要找到HPThemeManager對應的PID就可以(HPThemeManager是在論壇裏下載的,本來正在看代碼,就直接拿他來作試驗了)


現在,我們得到了兩個主要的信息:
進程ID:50127
崩潰地址:0x6d564f0

我們打開終端,輸入以下命令:


sudo malloc_history 50127 0x6d564f0

結果顯示爲:


這樣我們用能定位到這行代碼

NSString *themePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:themePathTmp];

對themePath進行排查,就找到了崩潰的罪魁禍首

[themePath release];

雖然是這樣,但是我還是沒有找到,估計是泄露的地方太多了。不過這個博客還是可以看看的








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章