Подтвердить что ты не робот

Какие хорошие методы отладки Perl?

Есть ли другие способы отладки Perl от Data::Dumper и perl -d?

4b9b3361

Ответ 1

Доступные инструменты для отладки

В Perl имеется несколько инструментов для отладки и подобных задач.


Встроенный отладчик командной строки.

perl -d yourcode.pl

Devel::ptkdb

Графический отладчик на основе Perl/Tk от Andrew E. Page.


Regex Coach

Это бесплатный инструмент, работающий как на Linux, так и на Windows, написанный на Lisp. Исходный код не доступный.


Rx: отладчик Regex для Perl

Отладчик Perl Regex и статья об этом, написанная Марком Джейсоном Доминисом.


Графический интерфейс для отладчика Perl

Ответ 2

Есть много вещей, которые помогут вам:

  • Devel::Trace - печатать каждую строку, которая выполняет
  • Carp::REPL - перейдите в REPL *, когда код выдает предупреждение
  • Devel::ebug - отладчик, который вы можете контролировать из кода Perl
  • Enbugger - использовать отладчик во время выполнения независимо от того, был ли запущен ваш процесс с отладкой

Ответ 3

Мне нравится Devel::Trace. В основном это дает вам дамп выполнения, показывая вам пути кода.

С другой стороны, Test Driven Development - это все злоба, поэтому вы также можете быть заинтересованы в инструментах профилирования, таких как Devel::NYTProf для высокотехнологичное тестирование. Смотрите сообщение в блоге Tim bunce для интересного обзора.

Ответ 4

Я использую ActiveState Komodo для пошаговой отладки.

Eclipse имеет пошаговый отладчик для Плагин EPIC.

Лично я предпочитаю версию ActiveState. Это просто кажется более прочным и стабильным, но оно действительно стоит (и работа платит за меня). Если бы это были мои деньги, я бы использовал Eclipse и EPIC, поскольку они бесплатны.

Ответ 5

Лучшие вспомогательные средства для отладки - это небольшие подпрограммы, короткие области действия, ограниченные побочные эффекты и множество тестов. Остановите ошибки, прежде чем они выйдут.

Ответ 6

Мой обычный набор инструментов:

  • операторы печати и данные:: Dumper для простых случаев
  • perl -d

Это обычно достаточно. Существует ddd; Я слышал, что он довольно приятный, но никогда не играл с ним.

Для некоторых задач (которые на самом деле не отлаживаются, но близко к ним) я использую Devel::NYTProf.

Ответ 7

Некоторые люди используют операторы print, чтобы узнать, что происходит в разделах программы, которые не выполняют то, что, по их мнению, будет делать код. (I.e., как способ проверки того, что фактически содержится в переменной в данной точке исполнения.)

Тем не менее, вопрос довольно расплывчатый. Есть ли что-то, что вы пытаетесь сделать, чтобы Data:: Dumper и perl -d не помогали?

Ответ 8

В зависимости от того, что вы делаете, Log::Log4perl обеспечивает простой способ управления стилем отпечатка "отпечаток", особенно в больших приложения:

  • предоставляет различные уровни ведения журнала (Debug, Info, Error, Warning, Fatal)
  • управляется из конфигурационных файлов (легко для отладки в области разработки, например, ошибок в области производства)
  • настраивается по разделам вашего приложения (например, веб-приложение в одном файле журнала на одном уровне, cron-скрипты в другом на другом уровне журнала)
  • настраивается классом - легко успокаивает шумные модули или добавляет подробную отладку где-то глубоко в приложении

Ответ 9

Test:: Больше для написания базовых тестов, Hook:: LexWrap, Test:: MockObject, Test:: Deep, Test:: MockTime, Test:: WWW:: Mechanize и многие другие для расширенных тестов. Attribute:: Подпись для проверки подпараметров. Carp:: Assert for contract-based programming.

Devel:: Ebug:: Wx или Devel:: ptkdb (и вскоре улучшенная поддержка в Padre) можно использовать для упрощения отладки.

Ответ 10

Emacs, руки вниз.

   emacs my_script.pl
   M-x perldb
   Emacs will prompt you :
   Run perldb (like this): perl my_script.pl
   Hit enter (or add command line switches)

   Now use the debugger as usual.
   Type 'c' to continue executing the code, which will now follow
   your code as you execute through it.

   Emacs is fully integrated with its debuggers and will make debugging perl code nearly trivial.

Ответ 11

Используйте, Devel:: SimpleTrace, для самой элегантной безрисковой отладки.

perl -MDevel:: SimpleTrace -we'warn "main"; sub foo {warn "external"; sub {warn "inner" }}; Foo() → ()

Ответ 12

Если вам не нравится perl -d, то Devel::REPL и Carp::REPL являются прекрасными альтернативами.

Ответ 13

Лично я большой поклонник Smart::Comments. Делает прослеживание мертвым простым, и не нужно снимать его снова.

use Smart::Comments -ENV;
...
sub myroutine {
    my ($self, @args) = @_ ;
    ### args: @args
    ...
}

Если в среде было установлено Smart_Comments, строки, начинающиеся С###, преобразуются в отладочный вывод, причем Dumper() используется автоматически. Если переменная окружения не установлена, материал отладки полностью инертен.

В нем есть куча функций, и будут отображаться индикаторы выполнения, предупреждения, условия прерывания, а также простой старый отладочный вывод.

Соответствующие тесты - все это хорошо, и я не отклоняю хорошую методологию разработки TDD, но, пытаясь добраться до сути существующей ошибки, Smart:: Comments - это выход.

Ответ 14

Обычно я использую

perl -d

для отладки.

Вы также можете использовать подключаемый модуль Eclipse Perl Integration (EPIC) для Eclipse. Он предлагает богатую среду отладки и интегрирован с средой разработки EPIC Perl. Вы можете использовать его и, как правило, полезно.

Ответ 15

Во время разработки мне нравится встраивать заявления printf в стратегических местах (не слишком много), которые включены с флагом отладки следующим образом:

printf("h='$h', j='$j', ... (%d)\n", __LINE__) if $debug;

где флаг отладки определен в верхней части script:

my $debug = $ENV{DEBUG} || 0;

Теперь вместо того, чтобы забыть прокомментировать все строки printf, я просто запустил script следующим образом:

DEBUG=1 ./script.pl

После тестирования, когда все готово для производства, строки отладки можно удалить:

cat script.pl | grep -v 'if $debug;'

Ответ 16

Я считаю, что тесты на запись могут сократить время отладки.

Ответ 18

Debug::Statements обеспечивает простой способ вставки и включения/выключения операторов печати для отладки.

Функция d() печатает имя вашей переменной, ее значение и имя подпрограммы. Реализация была оптимизирована для минимизации нажатий клавиш программиста.

Вот пример кода, чтобы вы начали:

my $myvar = 'some value';
my @list = ('zero', 1, 'two', "3");
my %hash = ('one' => 2, 'three' => 4);

use Debug::Statements;
my $d = 1;
d "Hello world";
d '$myvar';
d '@list %hash';

Вывод:

DEBUG sub mysub:  Hello world
DEBUG sub mysub:  $myvar = 'some value'
DEBUG sub mysub:  @list = [
  'zero',
  1,
  'two',
  '3'
]
DEBUG sub mysub:  %hash = {
  'one' => 2,
  'three' => 4
}

Для настройки вывода доступны многие параметры. Полная документация может быть найдена на CPAN.