如何追踪Devel :: Peek的起源

Mei*_*irG 4 perl perl-module

出乎我意料的我开始看到这样的线条:

SV = PVIV(0x38fe3f0) at 0x3de5b80
  REFCNT = 1
  FLAGS = (PADMY)
  IV = 0
  PV = 0
Run Code Online (Sandbox Code Playgroud)

这些看起来并不一致,如果我使用相同的输入重复运行脚本,有时会出现此输出,有时甚至两次,有时甚至根本不出现.

每隔一段时间,脚本就会挂起并显示一条错误消息"Perl很遗憾地停止运行".

它显然是输出Devel::Peek,但我的模块都没有使用它,我使用的唯一CPAN模块是Log :: Log4perl,Data :: Dumper :: AutoEncode(当然使用Data :: Dumper)和List :: Util.所有这些我广泛使用,我从来没有得到这种输出.

Box:Win-7 Pro 64位

我的perl5(修订版5版本18颠覆2)配置摘要:

  Platform:
    osname=MSWin32, osvers=6.2, archname=MSWin32-x64-multi-thread
    uname='Win32 strawberry-perl 5.18.2.1 #1 Tue Jan  7 22:32:35 2014 x64'
Run Code Online (Sandbox Code Playgroud)

有人可以建议我可以做的步骤来找到它的起源以及它为什么会发生?

谢谢

mob*_*mob 8

在脚本的顶部,添加以下内容:

BEGIN {
    use Carp qw( );
    use Devel::Peek qw( );
    my $old = \&Devel::Peek::Dump;
    my $new = sub { Carp::cluck("Devel::Peek::Dump got called somewhere!"); &$old };
    no warnings 'redefine';
    *Devel::Peek::Dump = $new;
}
Run Code Online (Sandbox Code Playgroud)

这需要在任何人Dump从Devel :: Peek 导入之前发生.

输出Carp::cluck将包括堆栈跟踪.


ike*_*ami 5

也许你找不到消息的来源,因为你正在寻找错误的东西.它也可以sv_dump是XS模块的输出.

use Inline C => <<'__EOI__';

   void dump_sv(SV* sv) {
      sv_dump(sv);
   }

__EOI__

dump_sv(1);
Run Code Online (Sandbox Code Playgroud)

输出:

SV = IV(0x34cd588) at 0x34cd598
  REFCNT = 1
  FLAGS = (IOK,READONLY,PROTECT,pIOK)
  IV = 1
Run Code Online (Sandbox Code Playgroud)

找到这些调用的选项:

  • perl在调试器下运行,并在其中设置断点sv_dump.(最可靠)
  • 转储.dll文件的符号,并为它们grep它们sv_dump.(也许?)
  • Grep您已安装的模块的源代码发行版.(最不可靠)