【发布时间】:2013-06-19 03:26:23
【问题描述】:
手头的问题是发现内存泄漏。我使用了 Devel::Refcount 来显示我的应用程序中的哪些对象不应该保留在内存中。
已经提出了三种方法来找到这些结构的难以捉摸的链接。
1 - 可能存在一种数据结构,可以让我获取引用我的对象的符号列表,这将是理想且直接的。
2 - 迭代所有已定义命名空间中的符号表以查找引用并使用迭代堆栈来确定它在哪里。
3 - 插入一个钩子,让我可以在特定引用的链接计数向上或向下更改时记录堆栈位置以及持有该链接的符号的地址。我可以使用它来查找哪些符号直接持有我的引用。
那么这可能吗?这种自省是很棘手的事情,我可能对 perl 非常了解,但我不知道该怎么做。我对padwalker的研究似乎可能有钥匙,但没有取得成果。你的想法?
【问题讨论】:
-
请注意,您可以使用内置的
Internals::SvREFCNT(%$self)访问引用计数 -
我有引用计数。我想要那些持有非零引用计数的结构的命名空间定义,以及持有非零引用计数的结构等,直到我在不应该的范围内找到具有定义值的变量。
-
我相信你有最终的 refcnt。既然你知道哪个对象在泄漏,你可以使用这个函数和标准调试来定位泄漏。
标签: perl memory-leaks introspection