【问题标题】:How can I track down the origin of Devel::Peek如何追踪 Devel::Peek 的起源
【发布时间】:2016-01-14 18:04:37
【问题描述】:

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

SV = PVIV(0x38fe3f0) at 0x3de5b80
  REFCNT = 1
  FLAGS = (PADMY)
  IV = 0
  PV = 0

这些不会出现一致,如果我重复运行脚本,使用 same 输入,有时会出现此输出,有时甚至 两次有时根本没有。

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

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

盒子:Win-7 Pro 64 位

我的perl5(revision 5 version 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'

有人可以建议我可以采取哪些步骤来找出这种情况的根源以及为什么会发生这种情况吗?

谢谢

【问题讨论】:

    标签: perl perl-module


    【解决方案1】:

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

    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 的输出将包含一个堆栈跟踪。

    【讨论】:

    • 事实上它没有:(
    • 更新了这个答案中的代码来解决我之前提到的问题。
    【解决方案2】:

    也许您找不到消息的来源,因为您正在寻找错误的东西。它也可能是 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 文件的符号,并用grep 查找sv_dump。 (也许?)
    • Grep 已安装模块的源代码分发。 (最不可靠)

    【讨论】:

      【解决方案3】:

      谢谢大家。

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

      【讨论】:

        猜你喜欢
        • 2014-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-05
        • 2011-02-19
        • 2014-08-30
        • 1970-01-01
        • 2010-11-04
        相关资源
        最近更新 更多