枚举perl解释器中的所有引用

时间:2013-06-21 21:38:26

标签: perl memory-leaks introspection

手头的问题是发现内存泄漏。我已经使用Devel :: Refcount来显示我的应用程序中的哪些对象在它们不应该存在时保留在内存中。

已经提出了三种方法来找到这些结构的难以捉摸的链接。

1 - 也许存在一个数据结构,让我得到引用我的对象的符号列表,这将是理想和直接的。

2 - 迭代所有已定义的命名空间中的符号表,查找引用并使用迭代堆栈来确定它的位置。

3 - 插入一个钩子,让我记录特定参考链接计数上下变化时的堆栈位置以及保存链接的符号的地址。我可以用它来找到哪些符号直接包含我的参考。

这可能吗?这种内省是棘手的东西,我可能非常了解perl,但我不知道如何做到这一点。我对Padwalker的研究似乎可能有关键并没有结出果实。你的想法?

2 个答案:

答案 0 :(得分:0)

Test::LeakTrace怎么样?

#!perl
use Test::LeakTrace;

no_leaks_ok {
    # Suspect code here
};

这会多次运行该块,然后如果解释器中的所有Perl值都增加,则Test :: LeakTrace认为存在内存泄漏。

答案 1 :(得分:-2)

您可以尝试遍历:: hash;这是主要的命名空间,它将符号名称映射到值。该命名空间中以::结尾的任何键都是可以通过迭代从命名空间获得的值来迭代的命名空间,或者只是将该命名空间视为哈希;即。

>perl -le 'print foreach keys %::'
version::
/
stderr
_<mro.c
Tie::
utf8::
"
re::
CORE::
DynaLoader::
mro::
stdout
attributes::

stdin
ARGV
INC
ENV
Regexp::
UNIVERSAL::
$
_<perlio.c
main::
_<perlmain.c
PerlIO::
0
_<universal.c

@
_<xsutils.c
STDOUT
IO::

_
STDERR
Internals::
STDIN
DB::





   >perl -le 'print foreach keys %mro::'
    get_mro
    get_linear_isa
    get_pkg_gen
    set_mro
    invalidate_all_method_caches
    is_universal
    method_changed_in
    get_isarev