2015-11-27 6 views
4

Out-оф-синий я начал видеть такие строки:Как я могу отследить происхождение Devel :: Peek

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

Они не появляются последовательно и если я бегу сценарий неоднократно, с такой же вход, этот выход иногда появляется, иногда даже дважды, а иногда и вовсе.

И время от времени сценарий зависает и отображает сообщение об ошибке «Perl, к сожалению, не работает».

Это, очевидно, выход Devel::Peek, но ни один из моих модулей использует его, и только модули CPAN я использую Log :: Log4perl, Data :: Dumper :: AutoEncode (который, конечно, использует данные :: 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' 

Может кто-то предложить шаги, которые я мог бы сделать, чтобы найти происхождение этого и почему это происходит?

Благодаря

ответ

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; 
} 

Это должно произойти, прежде чем кто-либо импортирует Dump от Devel :: Peek.

Выходной сигнал Carp::cluck будет содержать трассировку стека.

+0

В деле это не :( – MeirG

+0

Обновлен код в этом ответе, чтобы исправить проблему, о которой я упоминал ранее. – ikegami

5

Возможно, вы не можете найти источник сообщения, потому что ищете неправильную вещь. Это также может быть выход sv_dump от модуля XS.

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 

Параметры, чтобы определить местонахождение этих вызовов:

  • Run perl под отладчиком, и установить контрольную точку в sv_dump. (Самый надежный)
  • Сбросьте символы своих .dll файлов и скопируйте их для sv_dump. (Может быть?)
  • Grep исходные дистрибутивы модулей, которые вы установили. (Наименее достоверно)
0

Спасибо всем вам, ребята.

Претендент был, скорее всего, отсутствием заявления $sth->finish; после нескольких операций поиска БД. Поскольку я добавил их, я больше не вижу этих сообщений!