我开始看到这样的线条:
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'
有人可以建议我可以采取哪些措施来找到它的起源以及它为什么会发生?
由于
答案 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
。 (也许?)答案 2 :(得分:0)
谢谢你们所有人。
罪魁祸首很可能是在几次数据库检索操作后缺少$sth->finish;
语句。自从我添加了这些内容后,我再也看不到这些消息了!