1

正如標題所說,當垃圾回收未啓用時,我的應用程序崩潰。該應用程序會彈出幾秒鐘,然後它只是死機,什麼也沒有,但是這在調試器控制檯:應用程序崩潰未啓用垃圾回收

[Session started at 2009-08-17 15:03:20 -0600.] 
GNU gdb 6.3.50-20050815 (Apple version gdb-966) (Tue Mar 10 02:43:13 UTC 2009) 
Copyright 2004 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copies of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "i386-apple-darwin".sharedlibrary apply-load-rules all 
Attaching to process 12535. 
unable to read unknown load command 0x22 
unable to read unknown load command 0x22 
unable to read unknown load command 0x22 
unable to read unknown load command 0x22 

我不知道爲什麼它的發生。我認爲它可能是一個內存管理問題。我使用了AnalysisTool(Clang靜態分析器的前端)檢查泄漏和內存管理問題,並修復了它找到的問題。然而,通過樂器運行應用程序會在啓動時發現內存泄漏。我不知道這個漏洞是從哪裏來的...隨着垃圾收集啓用應用程序運行良好,但儀器仍然發現泄漏。

的源代碼可應要求提供

感謝

回答

2

由於錯誤表示在釋放對象上調用[CFArray countByEnumeratingWithState:objects:count:]時會出現該錯誤,因此您可以從中瞭解到哪裏可以找到相應的主意。該方法是NSFastEnumeration的一部分,因此除非您直接調用該方法(極不可能),否則將從您的數組對象的循環中調用該方法。如果你能弄清楚它在哪裏,你可以在for循環上(或剛好在之前)設置一個斷點,並檢查你的對象是否被釋放。這個問題的最可能原因是未能正確保留該數組,並且可能由運行循環排空NSAutoReleasePool而釋放。

+0

嗨,是的,我有幾個for循環。設置斷點後,如何檢查對象是否已被釋放? – indragie 2009-08-18 17:07:55

+0

在malloc_printf和malloc_debug_error上設置BP。 這應該帶你到你需要的地方。 – psychotik 2009-08-18 18:34:21

+0

謝謝,我發現了這個問題:) – indragie 2009-08-18 22:01:07

2
+1

這些都與Xcode沒有任何關係。它們是庫,調試器和其他工具的特徵。 – 2009-08-18 00:35:51

2

你可能會釋​​放一個對象時,你不應該,然後將其發送後續消息。不幸的是,崩潰(發送後續消息的地方)並不是問題所在 - 它是你在哪裏釋放(或更糟糕的是,釋放)你不應該在哪裏。鏗鏘的靜態分析儀並非萬無一失,盲目遵循建議並不一定會有所幫助。

+1

你說得對,我發現這個在控制檯設置NSZombieEnabled和NSDebugEnabled之後才崩潰: *** - [CFArray countByEnumeratingWithState:對象:伯爵:]:消息發送到釋放實例0x15e04b90 我不確定在它發生的地方。 – indragie 2009-08-17 22:47:47

+0

好的,你可以在某個地方分配一個數組,然後釋放/釋放它,同時仍然保持對它的引用。當您執行「發佈」消息並找出原因時,您需要追溯到該數組的所有引用。除非你在dealloc調用中,否則你不應該發送'dealloc'消息的對象,你只能在其中執行[super dealloc]。 – AlBlue 2009-08-18 07:31:43

+0

另一種方法(我之前沒有考慮過:-)是數組很好,但數組中的一個對象已經在其時間之前被釋放。 – AlBlue 2009-08-18 08:24:12

1

如果在顯示某些內容幾秒後崩潰,則可能表明需要保留的內容在運行循環結束時由autorelease池釋放。看看你用其他方法返回的對象分配變量的地方。任何沒有「新」,「複製」,「分配」的方法(我認爲還有其他一些方法)通常表示如果您想繼續使用它,則需要保留它。

這也可能意味着你已經發布了一些你不應該擁有的東西,並且它被autorelease池重新發布。看看你釋放對象的所有地方,並確保你只釋放你自己保留的對象,或者釋放由明確聲明所有權的方法返回的對象,比如「new」,「alloc」,「copy 「,」mutableCopy「等。

+0

謝謝,問題似乎是這樣的:* - [CFArray countByEnumeratingWithState:objects:count:]:發送到釋放實例0x15e04b90的消息。我用殼malloc_history和我得到這個: http://pastebin.com/m4ba1d576 我不知道從哪裏開始尋找問題,但。 – indragie 2009-08-17 23:01:51