了解Cocoa应用程序中的信息gc-roots

时间:2011-08-01 15:19:31

标签: objective-c cocoa

我正在尝试在Lion中调试GC问题。我的子类NSDocument,NSWindowController和NSWindow在10.6但不是10.7中被正确收集。

我已经检查了“info gc-roots”的输出,但我不明白它告诉我的是什么。我没有找到解释输出的文档。如果我忽略了它,我希望有人能指出我。

以下是窗口的输出:

(gdb) info gc-roots 0x181b3f0
Number of roots: 1
Root:
   0 Kind: bytes   rc:   1  Address: 0x019666c0  Offset: 0x00000014
   1 Kind: object  rc:   0  Address: 0x0181b3f0  Class: CCMDocumentWindow

(gdb) po 0x019666c0
<__NSAutoBlock__: 0x19666c0>

窗口控制器:

(gdb) info gc-roots 0x14f3680
Number of roots: 1
Root:
   0 Kind: bytes   rc:   1  Address: 0x019666c0  Offset: 0x00000014
   1 Kind: object  rc:   0  Address: 0x0181b3f0  Class: CCMDocumentWindow  ivar: NSWindow.NSResponder
   2 Kind: object  rc:   0  Address: 0x014f3680  Class: CCMWindowCtl

和文件:

(gdb) info gc-roots 0x181e690
Number of roots: 0

我的问题是:

  1. 文档的输出特别困扰我。如果没有根,不应该收集吗?

  2. 标有0的行中是否有任何有用的信息?

  3. 我在哪里可以找出为什么GC在10.7上失败? (我向Apple提交了一个支持事件,但是他们拒绝了它,并告诉我改为提交bug。)

1 个答案:

答案 0 :(得分:2)

  1. 如果保留计数> 0,则不会收集。 GC是OS X上的混合系统; CFRetain()/ CFRelease()仍然执行硬保留/释放,有效地告诉收集器不收集任何东西。因此,这是传统保留/释放环境中的泄漏。

  2. 是 - 这告诉您在0x019666c0处有一个无类型结构的分配(即调试器不知道它是什么),并且对根链中下一个项的引用是偏移量0x00000014。保留这个根; RC:1。

  3. 提交错误并附上您的二进制文件。您可以通过启用malloc日志记录并在调试器中执行info malloc 0x019666c0来进一步调试此问题。这将为您提供该地址的分配历史记录,并指出谁分配了那个没有释放它的结构(或者没有调用CFRelease())。或者你可以对根链中的任何项目做同样的事情。

  4. (是的,这一切都在window的背景下。)