首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何追踪发展的起源::窥视

我如何追踪发展的起源::窥视
EN

Stack Overflow用户
提问于 2015-11-27 15:42:49
回答 3查看 128关注 0票数 4

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

代码语言:javascript
复制
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)配置摘要:

代码语言:javascript
复制
  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'

有人能建议我可以采取什么措施来找出这种情况的根源以及发生的原因吗?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2015-11-27 15:53:09

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

代码语言:javascript
复制
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的输出将包括堆栈跟踪。

票数 8
EN

Stack Overflow用户

发布于 2015-11-27 16:47:15

也许你找不到信息的来源,因为你找错了东西。它也可以是来自XS模块的sv_dump输出。

代码语言:javascript
复制
use Inline C => <<'__EOI__';

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

__EOI__

dump_sv(1);

输出:

代码语言:javascript
复制
SV = IV(0x34cd588) at 0x34cd598
  REFCNT = 1
  FLAGS = (IOK,READONLY,PROTECT,pIOK)
  IV = 1

查找这些呼叫的选项:

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

Stack Overflow用户

发布于 2016-01-14 10:04:37

谢谢你们大家。

罪魁祸首很可能是在几次DB检索操作之后缺少$sth->finish;语句。因为我添加了这些信息,我再也看不到这些信息了!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33960768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档