我正在尝试在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
我的问题是:
文档的输出特别困扰我。如果没有根,不应该收集吗?
标有0的行中是否有任何有用的信息?
我在哪里可以找出为什么GC在10.7上失败? (我向Apple提交了一个支持事件,但是他们拒绝了它,并告诉我改为提交bug。)
答案 0 :(得分:2)
如果保留计数> 0,则不会收集。 GC是OS X上的混合系统; CFRetain()/ CFRelease()仍然执行硬保留/释放,有效地告诉收集器不收集任何东西。因此,这是传统保留/释放环境中的泄漏。
是 - 这告诉您在0x019666c0处有一个无类型结构的分配(即调试器不知道它是什么),并且对根链中下一个项的引用是偏移量0x00000014。保留这个根; RC:1。
提交错误并附上您的二进制文件。您可以通过启用malloc日志记录并在调试器中执行info malloc 0x019666c0
来进一步调试此问题。这将为您提供该地址的分配历史记录,并指出谁分配了那个没有释放它的结构(或者没有调用CFRelease())。或者你可以对根链中的任何项目做同样的事情。
(是的,这一切都在window
的背景下。)