2009-06-24 11 views

risposta

16

Available tools for debugging

Ci sono diversi strumenti disponibili in Perl per il debug e compiti simili.


Debugger da riga di comando incorporato.

perl -d yourcode.pl 

Devel::ptkdb

Perl/Tk basato debugger grafico da Andrew E. pagina.


Regex Coach

Questa uno strumento gratuito in esecuzione sia su Linux e Windows scritto in Lisp. Il codice sorgente non è disponibile.


Rx: A Regex Debugger for Perl

Il debugger Perl Regex e un articolo su di esso scritto da Mark Jason Dominus.


A GUI for the Perl Debugger

+1

+ WishPerl - è bello anche – joe

4

alcune persone usano print dichiarazioni per vedere cosa sta succedendo in sezioni di un programma che non stanno facendo quello che hanno pensato il codice farebbe. (I.e, come un modo di verificare ciò che è effettivamente contenuto in una variabile in un dato punto di esecuzione.)

Detto questo, la domanda è piuttosto vaga. C'è qualcosa che stai cercando di fare che Data :: Dumper e perl -d non ti stiano aiutando?

+0

Non è come. solo la curiosità vuole sapere l'altro modo di debug di Perl – joe

+2

Mi piace usare "warn" invece di "print" quindi va a stderr e non a stdout. "print STDERR" funziona anche, ma richiede una maggiore digitazione. – laalto

0

I test di scrittura possono principalmente ridurre il tempo di debug, credo.

5

mia consueta gamma di strumenti è:

  • dichiarazioni di stampa e Data :: Dumper per i casi semplici
  • perl -d

Questo è di solito sufficiente. C'è ddd; Ho sentito che è abbastanza carino, ma non ci ho mai giocato.

Per alcune attività (che non sono realmente debug, ma vicino ad esso) Io uso Devel::NYTProf.

+2

Suggerimento: s/Dati :: Dumper/Dati :: Dump /. È molto più nutriente. –

9

Mi piace Devel::Trace. Fondamentalmente ti dà un dump dell'esecuzione, mostrandoti i percorsi del codice.

Da un altro lato, Test Driven Development è di gran moda ora, quindi potresti anche essere interessato a strumenti di profilatura come Devel::NYTProf per test altamente avanzati. Vedi questo Tim bunce's blog post per una panoramica interessante.

8

Io uso ActiveState Komodo per il debug passo dopo passo.

Eclipse ha un debugger passo-passo per il suo EPIC plugin.

Personalmente preferisco la versione di ActiveState. Sembra solo più solido e stabile, ma costa (e il lavoro mi sta pagando). Se fossero i miei soldi, utilizzerei Eclipse ed EPIC poiché sono gratuiti.

3

Test :: Altro per la scrittura di test di base, Hook :: LexWrap, Test :: MockObject, Test :: Deep, Test :: MockTime, Test :: WWW :: Mechanize e molti altri per test avanzati. Attributo :: Firma per il controllo dei parametri secondari. Carp :: Assert per la programmazione basata su contratto.

Devel :: Ebug :: Wx o Devel :: ptkdb (e presto migliore supporto in Padre) può essere utilizzato per semplificare il debug.

13

Ci sono un sacco di cose là fuori per aiutarvi a:

  • Devel::Trace - stampare ogni riga che esegue
  • Carp::REPL - goccia in un REPL * quando il codice lancia un avvertimento
  • Devel::ebug - un debugger è possibile controllare dal codice Perl
  • Enbugger - utilizzare il debugger in fase di esecuzione indipendentemente dal fatto che il processo sia stato avviato con il debug
+0

* REPL = Read, Eval, Print Loop (== interprete interattivo) –

+0

@j_random_hacker Grazie, sono fuori grazie a YAPC. –

4

A seconda di quello che stai facendo, Log::Log4perl fornisce un modo semplice per gestire lo stile di 'stampa' di debugging in particolare nelle applicazioni più grandi:

  • prevede diversi livelli di registrazione (Debug, Informazioni, Errore, Avviso , Fatale)
  • controllato da file di configurazione (facile eseguire il debug sulla casella di sviluppo, solo errori sulla casella di produzione, ad esempio)
  • configurabile da sezioni della propria applicazione (ad es. web app in un unico file di log ad un certo livello, gli script cron in un altro a livello di registro diverso)
  • configurabili da Class - facile da quieten moduli rumorosi, o aggiungere un accurato debug da qualche parte nel profondo di un app
+0

Molte persone usano Log :: Log4perl quando Log :: Message (un modulo principale) farebbe. – MkV

7

Il i migliori strumenti per il debug sono le piccole routine, gli ambiti brevi, gli effetti collaterali limitati e molti test. Fermare gli insetti prima che si schiudano.

0

Some Other methods

CGI::Dump 

Benchmark 

Command-line options 

__DATA__ & <DATA> 

$. 

__FILE__ & __LINE__ 

warn() & die() 
2

Usa, Devel :: SimpleTrace, per il più elegante ampiamente positivo senza stato-debug.

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

1

genere io uso

perl -d 

per il debug.

È inoltre possibile utilizzare il plug-in Eclipse Perl Integration (EPIC) per Eclipse. Offre un ricco ambiente di debug disponibile e integrato con l'ambiente di sviluppo Perl EPIC. Puoi usarlo ed è generalmente utile.

1

Durante lo sviluppo, mi piace di incorporare istruzioni printf in luoghi strategici (non troppi) che sono abilitati con una bandiera di debug in questo modo:

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

in cui è definito il flag di debug nella parte superiore dello script :

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

Ora, invece di dover ricordare di commentare tutte le linee printf, ho appena eseguito lo script come segue:

DEBUG=1 ./script.pl 

Dopo la prova quando tutto è pronto per la produzione, le linee di debug possono essere rimossi:

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

Se non ti piace perl -d poi Devel::REPL e Carp::REPL sono entrambe le alternative belle.

+0

peccato Devel :: REPL richiede il Moose da 400 libbre (e vari moduli MooseX), e Carp :: REPL dipende da Devel :: REPL – MkV

+0

E questo è un problema perché ...? – singingfish

2

Personalmente, sono un grande fan di Smart::Comments. Rende la traccia semplice, senza bisogno di rimuoverla di nuovo.

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

Se Smart_Comments è stata impostata nell'ambiente, le linee che inizia con ### vengono convertiti in output di debug, con Dumper() utilizzato automagically. Se la variabile di ambiente non è impostata, il materiale di debug è completamente inerte.

Ha un sacco di funzioni e produce barre di avanzamento, avvisi, condizioni di interruzione e semplice vecchio output di debug.

I test appropriati sono tutti validi, e non sto ignorando una buona metodologia di sviluppo TDD, ma quando si cerca di andare a fondo di un bug esistente, Smart :: Comments è la soluzione giusta.

+0

Ed è un filtro sorgente, quindi fragile. – MkV

3

Emacs, giù le mani.

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. 
0

Debug::Statements fornisce un modo semplice per inserire e abilitare/disabilitare le istruzioni di stampa per il debug.

La funzione d() stampa il nome della variabile, il suo valore e il nome del subroutine. L'implementazione è stata ottimizzata per ridurre al minimo le sequenze di tasti del programmatore.

Ecco il codice di esempio per iniziare:

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

in uscita: sono a disposizione per personalizzare l'output

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 
} 

Molte opzioni. La documentazione completa può essere trovata su CPAN.

Problemi correlati