寻找过度释放的来源

时间:2010-03-31 05:40:51

标签: objective-c cocoa memory-management

我一直看到来自应用用户的崩溃报告中发送的相同消息。很明显,一个对象被过度释放但我无法复制它,我正在寻找跟踪它的来源的技巧。

崩溃报告中的相关部分显示了这一点:

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

我曾经使用僵尸和泄漏,但没有看到任何东西。 我已经完成了代码,看不到它。

下一步是什么? 是否有任何提示我可以从这些信息中看出它的来源?

这个几乎完全相同的崩溃报告反复出现这一事实是否意味着它是同一个被过度释放的对象,或者因为这是指自动释放池意味着它可能是任何对象?

对_CFRelease的引用是否意味着它是一个过度发布的Core Foundation对象?

1 个答案:

答案 0 :(得分:1)

  

我使用过僵尸和泄漏,但没有看到任何东西。

这很奇怪。

  

下一步是什么?

过度发布崩溃的下一步通常是使用Instruments的Zombies模板运行应用程序。第二个版本消息将在Instruments的时间线图中引发一个标记,您可以单击一个按钮以查找更多信息。

还可以尝试使用Xcode 3.2或更高版本中的静态分析器构建应用程序。

  

这个几乎完全相同的崩溃报告反复出现这一事实是否意味着它是同一个被过度释放的对象,或者因为这是指自动释放池意味着它可能是任何对象?

可以成为任何对象,但每次都几乎肯定是同一个对象,除非你在整个代码库中做错了内存管理。

  

对_CFRelease的引用是否意味着它是一个过度发布的Core Foundation对象?

没有