2010-03-31 56 views
0

我一直在看到從應用程序用戶發送的崩潰報告中發送的相同消息。很明顯,一個對象被過度釋放,但我無法複製它,我正在尋找提示追蹤它的來源。發現過度釋放的來源

從崩潰報告中的相關章節說明這一點:

Application Specific Information: 
objc_msgSend() selector name: release 

Thread 0 Crashed: Dispatch queue: com.apple.main-thread 
0 libobjc.A.dylib      0x90892edb objc_msgSend + 27 
1 com.apple.CoreFoundation   0x95ec5a40 __CFBasicHashStandardCallback + 384 
2 com.apple.CoreFoundation   0x95ec564e __CFBasicHashDrain + 478 
3 com.apple.CoreFoundation   0x95ead6f1 _CFRelease + 353 
4 com.apple.CoreFoundation   0x95eda0ed _CFAutoreleasePoolPop + 253 
5 com.apple.Foundation    0x97ecedd6 NSPopAutoreleasePool + 76 
6 com.apple.Foundation    0x97ececfe -[NSAutoreleasePool drain] + 130 
7 com.apple.AppKit     0x9211255f -[NSApplication run] + 1013 
8 com.apple.AppKit     0x9210a535 NSApplicationMain + 574 
9 TheApp       0x000020a6 start + 54 

我用殭屍和泄漏,但沒有看到任何有。 我已經通過代碼,看不到它。

下一步是什麼? 有沒有任何提示可以從這些信息中辨別出它的來源?

事實上,這個幾乎完全相同的崩潰報告重複進入意味着它是被釋放的同一個對象,或者因爲這是指autorelease池意味着它可能是任何對象?

對_CFRelease的引用是否意味着它是正在被釋放的核心基礎對象?

回答

1

我已經使用殭屍和泄漏,但沒有看到任何東西。

這很奇怪。

下一步是什麼?

過度釋放崩潰的下一步通常是使用樂器的「殭屍」模板運行應用程序。第二個發佈消息將在樂器的時間線圖中產生一個標誌,您可以點擊一個按鈕來查找更多信息。

另請嘗試在Xcode 3.2或更高版本中使用靜態分析器構建應用程序。

事實上,這個幾乎完全相同的崩潰報告重複進入意味着它是相同的對象被釋放,或者因爲這是指autorelease池意味着它可以是任何對象?

可能是任何對象,但每次幾乎可以肯定是同一個對象,除非你是在你的代碼庫都錯了做內存管理。

對_CFRelease的引用是否意味着它是一個正在被釋放的核心基礎對象?