出乎我意料的我开始看到这样的线条:
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)
有人可以建议我可以做的步骤来找到它的起源以及它为什么会发生?
谢谢
在脚本的顶部,添加以下内容:
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
将包括堆栈跟踪.
也许你找不到消息的来源,因为你正在寻找错误的东西.它也可以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
.(也许?)