perl – “PmmREFCNT_dec:REFCNT递减到0以下”是什么意思?

perl – “PmmREFCNT_dec:REFCNT递减到0以下”是什么意思?,第1张

概述我必须让perl非常沮丧,因为它给了我一个错误信息,这在perldiag中没有记录: PmmREFCNT_dec: REFCNT decremented below 0 for 53a6930!. 根据其情绪,有时会出现以下情况: *** glibc detected *** /usr/bin/perl: double free or corruption (!prev): 0x000000000 我必须让perl非常沮丧,因为它给了我一个错误信息,这在perldiag中没有记录:

PmmREFCNT_dec: REFCNT decremented below 0 for 53a6930!.

根据其情绪,有时会出现以下情况:

*** glibc detected *** /usr/bin/perl: double free or corruption (!prev): 0x0000000004e58a60 *

……或更明显地:

Segmentation fault

这显然是致命的,但我也测试过它是可以捕获的.当使用Try :: Tiny时,我将始终在同一个地方捕获错误,但是当不使用它时,在崩溃发生之前会执行更多指令.此外,即使我的模块完全是确定性的,并且我非常确定所有依赖关系也是如此,但错误不会一直发生.

不幸的是,给我这个问题的模块是巨大的,有很多依赖,我无法在一个较小的例子上复制问题.因此,我不能请求帮助调试它,但如果熟悉Perl内部的人知道在什么情况下发生此错误,这可能有助于我(或任何其他人将看到此消息)找到问题的根源和/或解决方法.

如果有用,一般的想法是这样的.我有两个课程,我们称之为Thing和SetofThings. SetofThings有一个属性,它是一组Thing实例.这两个类都有一个爆炸方法,它做这样的事情:

# SetofThingssub explode {    my $self = shift;    my $new  = dclone $self;    delete $new->{'some_attribute'};    $new->set_of_things( map { $_->explode } $self->constraints );    return $new;}# Thingsub explode {    my $self = shift;    return  map { new Thing( do_something_fancy ) } keys %$self;}

调用SetofThings :: explode或调用SetofThings :: set_of_things作为getter时,通常会出现错误.

编辑:Backtrace

我不相信我有足够的能力解释它,但我从gdb获得了一个回溯:

#0  0x00007ffff70a6094 in ?? () from /lib/x86_64-linux-gnu/libc.so.6#1  0x00007ffff70a76a8 in ?? () from /lib/x86_64-linux-gnu/libc.so.6#2  0x00007ffff70aab1c in free () from /lib/x86_64-linux-gnu/libc.so.6#3  0x00007ffff7b0869b in Perl_hv_undef_flags () from /usr/lib/libperl.so.5.14#4  0x00007ffff7b1ae66 in Perl_sv_clear () from /usr/lib/libperl.so.5.14#5  0x00007ffff7b1b292 in Perl_sv_free2 () from /usr/lib/libperl.so.5.14#6  0x00007ffff7b04bc3 in Perl_hv_free_ent () from /usr/lib/libperl.so.5.14#7  0x00007ffff7b04e6e in ?? () from /usr/lib/libperl.so.5.14#8  0x00007ffff7b08683 in Perl_hv_undef_flags () from /usr/lib/libperl.so.5.14#9  0x00007ffff7b1ae66 in Perl_sv_clear () from /usr/lib/libperl.so.5.14#10 0x00007ffff7b1b292 in Perl_sv_free2 () from /usr/lib/libperl.so.5.14#11 0x00007ffff7b42cef in Perl_leave_scope () from /usr/lib/libperl.so.5.14#12 0x00007ffff7b11112 in Perl_pp_leave () from /usr/lib/libperl.so.5.14#13 0x00007ffff7b0bce6 in Perl_runops_standard () from /usr/lib/libperl.so.5.14#14 0x00007ffff7aad815 in perl_run () from /usr/lib/libperl.so.5.14#15 0x0000000000400f89 in main ()

编辑2:Valgrind回溯

这是我从运行valgrind得到的.虽然我仍然不确定发生了什么,但至少现在我知道应该责怪谁. 总结

以上是内存溢出为你收集整理的perl – “PmmREFCNT_dec:REFCNT递减到0以下”是什么意思?全部内容,希望文章能够帮你解决perl – “PmmREFCNT_dec:REFCNT递减到0以下”是什么意思?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1271280.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存