Perl 如何追踪Devel::Peek的起源

Perl 如何追踪Devel::Peek的起源,perl,perl-module,Perl,Perl Module,突然,我开始看到这样的线条: SV = PVIV(0x38fe3f0) at 0x3de5b80 REFCNT = 1 FLAGS = (PADMY) IV = 0 PV = 0 这些不会一致地出现,如果我使用相同的输入重复运行脚本,则此输出有时会出现,有时甚至出现两次,有时甚至根本不会出现 每隔一段时间,脚本就会挂起并显示一条错误消息,说“Perl不幸停止运行” 它显然是Devel::Peek的输出,但我没有一个模块使用它,我使用的唯一CPAN模块是Log::Log4perl

突然,我开始看到这样的线条:

SV = PVIV(0x38fe3f0) at 0x3de5b80
  REFCNT = 1
  FLAGS = (PADMY)
  IV = 0
  PV = 0
这些不会一致地出现,如果我使用相同的输入重复运行脚本,则此输出有时会出现,有时甚至出现两次,有时甚至根本不会出现

每隔一段时间,脚本就会挂起并显示一条错误消息,说“Perl不幸停止运行”

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

方框:Win-7 Pro 64位

我的perl5(修订版5版本18 subversion 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'
有人能建议我可以采取什么步骤来找到这种现象的起源,以及它为什么会发生


谢谢

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

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;
}
这需要在任何人从Devel::Peek导入
Dump
之前发生


Carp::cluck
的输出将包含堆栈跟踪。

可能您找不到消息源,因为您找错了东西。它也可以是XS模块的
sv_dump
输出

use Inline C => <<'__EOI__';

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

__EOI__

dump_sv(1);
查找这些呼叫的选项:

  • 在调试器下运行
    perl
    ,并在
    sv_dump
    中设置断点。(最可靠)
  • 转储
    .dll
    文件的符号,并将其grep为
    sv\u Dump
    。(也许吧?)
  • Grep已安装模块的源发行版。(最不可靠)

    • 谢谢大家


      罪魁祸首很可能是缺少
      $sth->finish语句。自从我添加了这些,我再也看不到这些消息了

      事实上,它没有更新这个答案中的代码来修复我之前提到的问题。
      SV = IV(0x34cd588) at 0x34cd598
        REFCNT = 1
        FLAGS = (IOK,READONLY,PROTECT,pIOK)
        IV = 1