Perl 如何追踪Devel::Peek的起源
突然,我开始看到这样的线条:Perl 如何追踪Devel::Peek的起源,perl,perl-module,Perl,Perl Module,突然,我开始看到这样的线条: SV = PVIV(0x38fe3f0) at 0x3de5b80 REFCNT = 1 FLAGS = (PADMY) IV = 0 PV = 0 这些不会一致地出现,如果我使用相同的输入重复运行脚本,则此输出有时会出现,有时甚至出现两次,有时甚至根本不会出现 每隔一段时间,脚本就会挂起并显示一条错误消息,说“Perl不幸停止运行” 它显然是Devel::Peek的输出,但我没有一个模块使用它,我使用的唯一CPAN模块是Log::Log4perl
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)配置摘要:
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'
有人能建议我可以采取什么步骤来找到这种现象的起源,以及它为什么会发生
谢谢在脚本顶部添加以下内容:
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
的输出将包含堆栈跟踪。可能您找不到消息源,因为您找错了东西。它也可以是XS模块的sv_dump
输出
use Inline C => <<'__EOI__';
void dump_sv(SV* sv) {
sv_dump(sv);
}
__EOI__
dump_sv(1);
查找这些呼叫的选项:
- 在调试器下运行
,并在perl
中设置断点。(最可靠)sv_dump
- 转储
文件的符号,并将其grep为.dll
。(也许吧?)sv\u Dump
- Grep已安装模块的源发行版。(最不可靠)
- 谢谢大家
罪魁祸首很可能是缺少
$sth->finish在两次数据库检索操作之后的代码>语句。自从我添加了这些,我再也看不到这些消息了 事实上,它没有更新这个答案中的代码来修复我之前提到的问题。
SV = IV(0x34cd588) at 0x34cd598
REFCNT = 1
FLAGS = (IOK,READONLY,PROTECT,pIOK)
IV = 1