Как я могу контролировать стек вызовов Perl?

StackOverflow https://stackoverflow.com/questions/2024904

  •  19-09-2019
  •  | 
  •  

Вопрос

Я использую ActivePerl 5.8 в Windows XP.

use strict;
use warnings;
use Data::Dumper;

В моем сценарии используются три подпрограммы.

Чтобы обнаружить стек вызовов, я могу лишь вставить несколько print "some location"; и проверьте результат печати из окна консоли.

Есть ли хороший способ контролировать это?Спасибо.

Это было полезно?

Решение

Вы не уточнили, почему вы хотите отслеживать стек вызовов и отслеживать своих подписчиков, поэтому ответы должны быть широкими.

Один из методов caller:

звонящий

Возвращает контекст текущего вызова подпрограммы.В скалярном контексте возвращает имя пакета вызывающего объекта, если вызывающий объект существует, то есть если мы находимся в подпрограмме, eval или require, и неопределенное значение в противном случае.В контексте списка возвращает

# 0         1          2
($package, $filename, $line) = caller;

EXPR возвращает некоторую дополнительную информацию, которую отладчик использует для печати трассировки стека.Значение EXPR указывает, на сколько кадров вызова нужно вернуться до текущего.

#  0         1          2      3            4
  ($package, $filename, $line, $subroutine, $hasargs,
#  5          6          7            8       9         10
$wantarray, $evaltext, $is_require, $hints, $bitmask, $hinthash)
 = caller($i);

Вы также можете использовать Девел::Обложка модуль:

Данные о покрытии кода собираются с помощью подключаемой функции runops, которая подсчитывает, сколько раз выполняется каждая операция.Эти данные затем преобразуются в реальность с помощью модулей компилятора B.Существует также средство профилирования операторов, которому требуется более совершенный бэкэнд, чтобы быть действительно полезным.

Чем больше вы расскажете нам о том, чем хотите заняться, тем полезнее для вас будут наши ответы!

Другие советы

Если это ваш код, вы можете использовать:

Carp::cluck( "And here's the stack:" );

Видеть Carp::cluck.Он распечатывает предупреждение с трассировкой стека.Он работает как стиль вывода отладки «printf».

Используйте отладчик T команда.

Пример:

$ perl -d -e'
sub foo {}
sub bar { foo; }
bar;
'

Loading DB routines from perl5db.pl version 1.32
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(-e:4):   bar;
  DB<1> s
main::bar(-e:3):        sub bar { foo; }
  DB<1> s
main::foo(-e:2):        sub foo {}
  DB<1> T
. = main::foo() called from -e line 3
. = main::bar() called from -e line 4
  DB<1> s
Debugged program terminated.  Use q to quit or R to restart,
  use o inhibit_exit to avoid stopping after program termination,
  h q, h R or h o to get additional info.
  DB<1> q

Вам редко придется напрямую управлять стеком вызовов в Perl.Если ты это сделаешь caller это тот инструмент, который вам нужен.Однако это требуется лишь в редких случаях.

Чаще всего во время отладки я хочу видеть трассировку стека.Хорошие новости: получить трассировку стека легко, просто используйте Карп's confess и cluck функции вместо die и warn.

use strict;
use warnings;
use Carp;

bar(6.1);
bar(1);

sub foo {
    confess "Oh noes" unless @_ == 6;  # confess is fatal
}

sub bar {
    my $count = shift;
    cluck "bar is in trouble" unless int $count == $count;  # cluck is not fatal
    foo( ('a')x $count );
}

Это даст вам:

dao:~ toad$ perl test.pl
bar is in trouble at test.pl line 14
    main::bar(6.1) called at test.pl line 5
Oh noes at test.pl line 9
    main::foo('a') called at test.pl line 15
    main::bar(1) called at test.pl line 6
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top