2012-02-06 52 views
0

我的Mac應用程序在運行循環中碰撞exc_bad_access。 所以我啓用NSZombies,現在我沒有看到預期的錯誤(因爲對象沒有解除分配)。已啓用NSZombies,調試信息

但是,我沒有找到任何有用的NSZombie登錄控制檯。 有沒有辦法找出問題?

回答

3

這很具有挑戰性。 Cocoa中這個錯誤的最常見原因是直接訪問你的ivars而不是使用訪問器。訪問器使絕大多數內存崩潰消失。

這就是說,它們不是導致內存錯誤的唯一原因。您可能正在以其他方式訪問內存。 NSZombie做了一件特別的事情:當您釋放一個對象時,NSZombie說「實際上不會釋放該對象。」相反,它會將對象轉換爲殭屍對象,如果您發送消息則會打印一個錯誤。但是,這隻有在崩潰是由於將消息發送到解除分配的實例時纔有用。這可能是很多其他的事情。

您應該先從崩潰堆棧本身開始。查看堆棧並查看它可能是什麼類型的對象,或者可能調用它的對象。

閱讀TN2124,特別是關於BSD內存分配器的部分,以及內存使用性能指南的Enabling the Malloc Debugging Features部分。有比您可以使用的NSZombie更低級別的工具。 MallocScribble通常是最有用的。它用0x55覆蓋釋放的內存,以便更快地崩潰,並更容易檢測調試器中的釋放內存。 MallocPreScribble對於查找未初始化的內存非常有用,但這隻有在您執行原始malloc調用時纔有用。 ObjC對象總是被預先初始化。

當然,你必須戴上你的偵探帽子。你的計劃哪些部分最可疑?你正在做多線程工作(如果你沒有正確鎖定,會導致內存崩潰)。

如果它很容易重現,那麼你會弄清楚。如果它只是偶爾發生,那麼......我有時會在很多個月內找到像這樣的錯誤。有時候這很難。

+0

應用程序與NSZombie運行得很好。正如你所說,NSZombie實際上並沒有釋放對象。 想知道如果有消失來檢測任何嘗試引用該解除分配的對象。 – coder000001 2012-02-06 22:53:34

+0

不準確,但MallocScribble將有所幫助。當你使用它時,不要忘記MallocStackLogging。 – 2012-02-06 23:03:02

+0

謝謝,它真的幫助。我縮小了它http://stackoverflow.com/questions/9168936/hidmanager-wierd-cfrunloop-termination – coder000001 2012-02-06 23:40:49

0

您需要使用內存分析器。只需使用Profile選項並選擇泄漏。

+0

是的,我觸發了分析器。我沒有發現任何奇怪或任何殭屍消息 – coder000001 2012-02-06 22:51:10