如何跟踪对Perl对象的引用?

mmc*_*coo 7 perl memory-management

我正在尝试修复我的代码以使Perl能够通过削弱引用和打破周期来恢复不需要的数据.

我最近问了一个关于如何访问Perl引用计数的问题,答案对我来说效果很好.

对于我的一些对象,引用计数> 1,我不知道为什么.

有没有办法让我添加一个回调或什么来帮助我知道引用计数何时递增?我想知道谁在引用一个对象.

mob*_*mob 5

实现一个Devel::XXX检查对象的refcounts的包?

package Devel::Something;
# just emulating Devel::Trace here
# see http://cpansearch.perl.org/src/MJD/Devel-Trace-0.10/Trace.pm
sub DB::DB {
    if ($Devel::Something::CHECK) {
        my ($package, $file, $linenumber) = caller;
        ... inspect current refcounts
        ... if any have changed, print out the details
        ...    including current package/file/linenumber
        $Devel::Something::CHECK = 0;  # disable until it's enabled again
    }
}
1;
Run Code Online (Sandbox Code Playgroud)
# my program
... do some stuff ...
$Devel::Something::CHECK = 1;
... do some more stuff ...
$Devel::Something::CHECK = 1;
Run Code Online (Sandbox Code Playgroud)
$ perl -d:Something my_program.pl ...
Run Code Online (Sandbox Code Playgroud)

您可以$Devel::Something::CHECK = 1在整个代码中的适当位置撒上语句,或者将条件更改DB::DB为定期运行(例如,if (++$Devel::Something::CHECK % 100 == 0) {在每100次语句评估后进行检查).