Jakie są dobre metody debugowania Perla?

Czy są jakieś inne sposoby debugowania Perla poza Data::Dumper i perl -d?

Author: joe, 2009-06-24

18 answers

Dostępne narzędzia do debugowania

W Perlu dostępnych jest kilka narzędzi do debugowania i podobnych zadań.


Wbudowany debugger wiersza poleceń.

perl -d yourcode.pl

Devel:: ptkdb

Debugger graficzny oparty na Perl/Tk autorstwa Andrew E. Page ' a.


Regex Coach

To darmowe narzędzie działające zarówno pod Linuksem, jak i Windows napisane w Lisp . Kod źródłowy nie jest dostępny.


RX: Debugger Regex dla Perla

Debugger Regex Perla i artykuł o nim napisany przez Marka Jasona Dominusa.


GUI dla debugera Perla

 16
Author: Haim Evgi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 16:36:29

Jest wiele rzeczy, które mogą Ci pomóc:

  • Devel:: Trace - wyświetla każdą linię wykonującą
  • Carp:: REPL - drop to a REPL * when the code throws a warning
  • Devel::ebug - debuger, który możesz kontrolować za pomocą kodu Perla
  • Enbugger - używaj debuggera w czasie wykonywania, niezależnie od tego, czy proces został uruchomiony z debugowaniem
 13
Author: Chas. Owens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 16:36:05

Lubię Devel:: Trace . Zasadniczo daje zrzut wykonań, pokazując ścieżki kodu.

Z drugiej strony, Test Driven Development jest teraz szaloną nowością, więc możesz być również zainteresowany narzędziami do profilowania, takimi jakDevel::NYTProf do wysoce zaawansowanych testów. Zobacz ten Tim bunce ' s blog post dla interesującego przeglądu.

 9
Author: wazoox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 06:06:09

Używam ActiveState Komodo do debugowania krok po kroku.

Eclipse posiada debugger krok po kroku dla swojej wtyczki EPIC .

Osobiście wolę wersję ActiveState. Po prostu wydaje się bardziej solidny i stabilny, ale kosztuje (a praca mnie opłaca). Gdyby to były moje pieniądze, użyłbym Eclipse i EPIC, ponieważ są one darmowe.

 8
Author: Xetius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-11 00:00:38

Najlepsze pomoce do debugowania to małe procedury, krótkie zakresy, ograniczone skutki uboczne i wiele testów. Zatrzymać robaki, zanim się wyklują.

 7
Author: brian d foy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 17:58:47

Mój zwykły zakres narzędzi to:

  • print statements and Data:: Dumper for simple cases
  • perl-d

To zwykle wystarczy. Jest ddd; słyszałem, że jest całkiem ładny, ale nigdy się nim nie bawiłem.

Do niektórych zadań (które nie są tak naprawdę debugowaniem, ale blisko niego) używam Devel::NYTProf.

 5
Author: titanofold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 16:43:23

Niektórzy ludzie używają instrukcji print, aby zobaczyć, co dzieje się w sekcjach programu, które nie robią tego, co ich zdaniem kod zrobi. (TJ., jako sposób sprawdzenia co faktycznie zawiera się w danej zmiennej w danym punkcie wykonania.)

To powiedziawszy, pytanie jest dość niejasne. Czy jest coś, w czym próbujesz zrobić, że Data:: Dumper i perl -d nie pomagają?
 4
Author: Telemachus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 10:43:15

W zależności od tego, co robisz, Log::Log4perl zapewnia łatwy sposób zarządzania stylem debugowania "drukowania", szczególnie w większych aplikacjach:

  • zapewnia różne poziomy logowania (Debug, Info, Error, Warning, Fatal)
  • kontrolowane z plików konfiguracyjnych (łatwe do debugowania na polu deweloperskim, tylko błędy na polu produkcyjnym, na przykład)
  • konfigurowalne przez sekcje aplikacji (np. aplikacja internetowa w jednym pliku dziennika na jednym poziomie, Skrypty cron w innym na innym poziomie dziennika)
  • [[5]} konfigurowalny przez klasy-łatwe do wyciszenia głośnych modułów, lub dodać szczegółowe debugowanie gdzieś głęboko w aplikacji
 4
Author: plusplus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 16:37:23

Test::więcej do pisania testów podstawowych, Hook::LexWrap, Test::MockObject, Test::Deep, Test::Moctime, Test::WWW:: Mechanize i wiele innych do testów zaawansowanych. Atrybut:: Signature for checking sub params. Karp::

Devel::Ebug::WX lub Devel::ptkdb (a wkrótce lepsze wsparcie w Padre) mogą być użyte do łatwiejszego debugowania.

 3
Author: Alexandr Ciornii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 14:49:12

Emacs, ręce w dół.

   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.
 3
Author: Felix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-28 22:56:05

Użyj, Devel:: SimpleTrace, dla najbardziej eleganckiego seemless bezstanowego debugowania.

Perl-Mdevel::SimpleTrace-we ' warn "main"; sub foo{ warn "outer"; sub { warn "inner"}}; foo()->()'

 2
Author: Evan Carroll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-26 20:27:58

Jeśli nie lubisz perl -d to Devel::REPL i Carp::REPL są dobrymi alternatywami.

 2
Author: singingfish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 16:33:05

Osobiście jestem wielkim fanem Smart:: Komentarze . Sprawia, że śledzenie martwe proste, nie trzeba go ponownie rozebrać, albo.

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

Jeśli Smart_Comments zostało ustawione w środowisku, linie rozpoczynające się od # # # są konwertowane na wyjście debugowania, a Dumper() używane automagicznie. Jeśli zmienna środowiskowa nie jest ustawiona, debugowanie jest całkowicie obojętne.

Posiada mnóstwo funkcji i będzie produkować paski postępu, Ostrzeżenia, warunki przerwania, a także zwykłe stare debugowanie wyjście.

Odpowiednie testy są dobre i nie odrzucam dobrej metodologii rozwoju TDD, ale próbując dotrzeć do sedna istniejącego błędu, SMART:: Comments jest najlepszym rozwiązaniem.

 2
Author: RET,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 16:38:46

Ogólnie używam

perl -d

Do debugowania.

Możesz również użyć Eclipse Perl Integration (EPIC) plug-in Dla Eclipse oferuje bogate środowisko debugowania dostępne i zintegrowane ze środowiskiem programistycznym EPIC Perl. Można go używać i jest ogólnie pomocny.

 1
Author: PJ.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-04 06:05:23

Podczas tworzenia, Lubię osadzać instrukcje printf w strategicznych miejscach (nie zbyt wielu), które są włączone z flagą debugowania taką jak Ta:

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

Gdzie znacznik debug jest zdefiniowany u góry skryptu:

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

Teraz zamiast pamiętać o komentowaniu wszystkich linii printf, uruchamiam skrypt w następujący sposób:

DEBUG=1 ./script.pl

Po przetestowaniu, gdy wszystko jest gotowe do produkcji, linie debugowania można usunąć:

cat script.pl | grep -v 'if $debug;'
 1
Author: Kiffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-10 21:16:40

Pisanie testów może skrócić czas debugowania.

 0
Author: Alan Haggai Alavi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 10:48:34

Niektóre inne metody

CGI::Dump

Benchmark

Command-line options 

__DATA__ & <DATA> 

$.

__FILE__ & __LINE__ 

warn() & die() 
 0
Author: joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-08 15:35:11

Debug:: Statements zapewnia łatwy sposób wstawiania i włączania/wyłączania instrukcji print do debugowania.

Funkcja d() wyświetla nazwę zmiennej, jej wartość i nazwę podprogramu. Implementacja została zoptymalizowana w celu zminimalizowania naciśnięć klawiszy programisty.

Oto przykładowy kod na początek:

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

Wyjście:

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
}

Wiele opcji jest dostępnych, aby dostosować wyjście. Pełna dokumentacja znajduje się na CPAN.

 0
Author: Chris Koknat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-05 17:21:53