子程序条目中UNKNOWN的奇怪副本

时间:2011-06-02 16:26:24

标签: perl svn

使用git时,我正在使用SVN perl模块中的错误:

Bizarre copy of UNKNOWN in subroutine entry at 
/usr/lib/perl5/vendor_perl/SVN/Base.pm line 80.

而且我不太确定这是一个perl bug还是一个颠覆bug。这是相关部分:

# insert the accessor
if (m/(.*)_get$/) {
    my $member = $1;
    *{"${caller}::$1"} = sub {
    &{"SVN::_${pkg}::${prefix}${member}_". # <<<< line 80
          (@_ > 1 ? 'set' : 'get')} (@_)
      }
}

full source

什么是“奇怪的副本”?谁的错呢?

编辑:软件版本

  • 颠覆1.6.15-1
  • perl 5.14.0-1

解决方案:当您使用不兼容的标志进行编译时会发生这种情况:

https://groups.google.com/d/msg/subversion_users/EOru50ml6sk/5xrbu3luPk4J

3 个答案:

答案 0 :(得分:10)

perldoc为您提供简短的答案,但简短的STFW会话会产生更多细节。这基本上是Perl中碎片堆栈的证据。

琐碎的例子:

#!/usr/bin/perl
my @A = 1..5;
sub blowUp {
   undef @A;
   my $throwAway = {};
   print for @_;       # <== line 6
}
blowUp(@A);
__END__
bash$ ./blowitup
Bizarre copy of HASH in print at ./blowitup line 6.

为了让它变得更有趣,没有$ throwAway赋值,这是一个看不见的错误(虽然在“使用警告”下它至少仍会告诉你,你正试图访问未初始化的值)。只是当你做一个新的任务,你才能看到奇怪的行为。

因为@_本质上是词法范围的子程序,并且参数是通过引用传递的,所以这个小子程序基本上通过取消@_指向的东西来拉出自己的内容(你得到相同的行为)如果你将undef更改为一个赋值,fwiw)。我在perl5-porters上发现了一些帖子,这些帖子提到这是一个事实,即堆栈中的项目不是引用计数,因此没有干净利落。

因此,虽然我没有仔细查看完整源代码中的所有代码,但我会继续猜测那里的某些东西搞乱了@_传递的东西;然后当再次引用@_时,Perl告诉你丹麦的东西已经腐烂了。

直接问题是脚本/模块中的错误,哇。 Perl没有引用计算这些项目的更深层次的问题也存在,但我怀疑你在短期内修复模块会有更好的运气。 : - )

HTH- 布赖恩

答案 1 :(得分:5)

当Perl的堆栈损坏或包含非标量时,会出现“奇怪的副本”。它是由Perl本身或XS模块中的错误引起的。 (Brian Gerard的例子练习了一长串与堆栈相关的已知错误中没有被重新计算的错误。)

您可以通过在anon sub中添加以下内容来隔离问题:

warn("Calling SVN::_${pkg}::${prefix}${member}_".(@_ > 1 ? 'set' : 'get')."...");

您甚至可能希望发出堆栈跟踪,但您可能必须使用caller自行构建它,以避免在构建堆栈跟踪时触发混乱。

答案 2 :(得分:4)

可能是一个perl bug。 SVN :: Base有XS组件,但错误发生在纯perl代码中,我认为perl永远不应该允许它发生。然而,SVN :: Base中有一些奇怪的XS可能会调整它。

最好的想法:将其归档Subversion subcomponent bindings_swig_perlperlbug