3

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

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

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

2 - 迭代所有已定义名称空间中的符号表以查找引用并使用迭代堆栈来确定它在哪里。

3 - 插入一个钩子,当特定引用的链接计数向上或向下更改时,我可以记录堆栈位置以及持有该链接的符号的地址。我可以使用它来查找哪些符号直接持有我的参考。

那么这可能吗?这种自省是很棘手的事情,我可能对 perl 非常了解,但我不知道该怎么做。我对padwalker的研究似乎可能有钥匙,但没有结出硕果。你的意见?

4

2 回答 2

0

Test::LeakTrace怎么样?

#!perl
use Test::LeakTrace;

no_leaks_ok {
    # Suspect code here
};

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

于 2013-06-21T23:59:59.070 回答
-2

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

>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
于 2013-06-21T21:49:26.517 回答