如何追踪Devel :: Peek的起源

时间:2015-11-27 15:42:50

标签: perl perl-module

我开始看到这样的线条:

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。 所有这些我广泛使用,我从来没有得到这种输出。

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'

有人可以建议我可以采取哪些措施来找到它的起源以及它为什么会发生?

由于

3 个答案:

答案 0 :(得分: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;
}

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

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

答案 1 :(得分:5)

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

use Inline C => <<'__EOI__';

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

__EOI__

dump_sv(1);

输出:

SV = IV(0x34cd588) at 0x34cd598
  REFCNT = 1
  FLAGS = (IOK,READONLY,PROTECT,pIOK)
  IV = 1

查找这些来电的选项:

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

答案 2 :(得分:0)

谢谢你们所有人。

罪魁祸首很可能是在几次数据库检索操作后缺少$sth->finish;语句。自从我添加了这些内容后,我再也看不到这些消息了!