Получение отслеживаний стека в Perl? [дубликат]

Этот вопрос уже имеет ответ здесь:

Как я получаю отслеживания стека в Perl?

22
задан Mat 9 April 2013 в 05:29
поделиться

3 ответа

Существует множество полезных инструментов, основанных на ядре и CPAN, для создания трассировки стека (как показано в других ответах). Однако, если вы хотите создать свой собственный, проверьте caller builtin. С ее помощью вы можете пройтись по стеку и посмотреть, что именно происходит.

17
ответ дан 29 November 2019 в 03:22
поделиться

Для отладки мне нравится Карп :: Всегда .

perl -MCarp::Always my_script.pl
32
ответ дан 29 November 2019 в 03:22
поделиться

Carp :: confess (из используйте Carp; ) даст вам полную трассировку стека как часть ошибки. Если вам это просто нужно в связи с чем-то неудачным, признайтесь, - это все, что вам действительно нужно.

Согласно комментариям, вот вывод различных функций Carp :

use strict;
use warnings;
use Carp qw/longmess cluck confess/;

sub foo {
  &bar;
}

sub bar {
   &baz;
}

sub baz {
   shift->();
}

my %tests = (
    'longmess' => sub { print longmess 'longmess' },
    'cluck'    => sub { cluck 'using cluck' },
    'confess'  => sub { confess 'using confess' },
);

while (my ($name, $sub) = each %tests) {
    print "$name - before eval:\n";
    eval {
        foo($sub);
    };
    print "$name - before if:\n";
    if ($@) {
        print "caught: $@";
    }
    print "$name - done\n\n";
}

Запустив этот сценарий, вы получите:

longmess - before eval:
longmess at - line 14
        main::baz called at - line 10
        main::bar called at - line 6
        main::foo('CODE(0x183a4d0)') called at - line 26
        eval {...} called at - line 25
longmess - before if:
longmess - done

confess - before eval:
confess - before if:
caught: using confess at - line 20
        main::__ANON__() called at - line 14
        main::baz called at - line 10
        main::bar called at - line 6
        main::foo('CODE(0x183a3e0)') called at - line 26
        eval {...} called at - line 25
confess - done

cluck - before eval:
using cluck at - line 19
        main::__ANON__() called at - line 14
        main::baz called at - line 10
        main::bar called at - line 6
        main::foo('CODE(0x183a434)') called at - line 26
        eval {...} called at - line 25
cluck - before if:
cluck - done

Выполнив этот сценарий, но перенаправив STDOUT (таким образом, показывая, что печатается на STDERR), вы получите :

using cluck at - line 19
        main::__ANON__() called at - line 14
        main::baz called at - line 10
        main::bar called at - line 6
        main::foo('CODE(0x183a434)') called at - line 26
        eval {...} called at - line 25
34
ответ дан 29 November 2019 в 03:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: