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

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

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

Существует три подпрограммы, используемые в моем сценарии.

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

Там какой-либо хороший метод состоит в том, чтобы контролировать его?Спасибо.

5
задан Michael Carman 8 January 2010 в 16:16
поделиться

4 ответа

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

Одним из методов является вызывающий:

вызывающий

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

# 0 1 2
($package, $filename, $line) = звонящий;

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

# 0 1 2 3 4
 ($package, $filename, $line, $subroutine, $hasargs.)
# 5 6 7 8 9 10
$вантаррей, $evaltext, $is_require, $hints, $bitmask, $hinthash)
 = звонящий($i);

Также можно использовать модуль Devel::Cover:

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

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

5
ответ дан 18 December 2019 в 06:35
поделиться

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

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

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

10
ответ дан 18 December 2019 в 06:35
поделиться

Используйте команду отладчика 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
9
ответ дан 18 December 2019 в 06:35
поделиться

Вы редко должны напрямую управлять стеком вызова в Перл Если вы сделаете звонящий - это инструмент, который вы хотите. Тем не менее, это только редко нужно.

Чаще всего я хочу увидеть трассировку стека, когда я отладку. Хорошие новости, ее легко получить трассировку стека, просто используйте CARP и функции и функций , вместо умереть и предупреждают .

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
0
ответ дан 18 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

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