2009-06-24 19 views

Respuesta

16

Available tools for debugging

Hay varias herramientas disponibles en Perl para la depuración y tareas similares.


Depurador de línea de comandos incorporado.

perl -d yourcode.pl 

Devel::ptkdb

Perl/Tk basado depurador gráfico de Andrew E. página.


Regex Coach

Esta herramienta de funcionamiento libre tanto en Linux y Windows escrito en Lisp. El código fuente no es disponible.


Rx: A Regex Debugger for Perl

El depurador Perl expresiones regulares y un artículo sobre el tema escrito por Mark Jason Dominus.


A GUI for the Perl Debugger

+1

+ WishPerl - es bueno también – joe

4

Algunas personas utilizan print declaraciones con el fin de ver lo que está pasando en secciones de un programa que no están haciendo lo que pensaban que el código haría. (Es decir, como una forma de verificar lo que realmente está contenido en una variable en un punto de ejecución dado).

Dicho esto, la pregunta es bastante vaga. ¿Hay algo que intentes hacer con el que Data :: Dumper y perl -d no están ayudando?

+0

No es así. solo curiosidad, quiero saber otra manera de depurar Perl – joe

+2

Me gusta usar "advertir" en lugar de "imprimir" para que pase a stderr y no a stdout. "print STDERR" también funciona, pero necesita más tipeo. – laalto

0

Las pruebas de escritura en su mayoría pueden disminuir el tiempo de depuración, creo.

5

Mi rango habitual de herramientas es:

  • declaraciones de impresión y datos :: Dumper para casos sencillos
  • perl -d

Eso es por lo general suficiente. Hay ddd; Escuché que es bastante agradable, pero nunca jugué con eso.

Para algunas tareas (que en realidad no están depurando, pero cerca de eso) utilizo Devel::NYTProf.

+2

Sugerencia: s/Data :: Dumper/Data :: Dump /. Es mucho más nutritivo. –

9

Me gusta Devel::Trace. Básicamente le da un volcado de ejecución, que le muestra las rutas de código.

Por otro lado, Test Driven Development está de moda ahora, por lo que también podría estar interesado en herramientas de creación de perfiles como Devel::NYTProf para pruebas muy avanzadas. Consulte esto Tim bunce's blog post para obtener una descripción interesante.

8

Yo uso ActiveState Komodo para la depuración paso a paso.

tiene un depurador paso a paso para su EPIC plugin

Personalmente prefiero la versión ActiveState. Simplemente parece más sólido y estable, pero cuesta (y el trabajo me paga). Si fuera mi dinero, usaría Eclipse y EPIC ya que son gratuitos.

3

Prueba :: Más para escribir pruebas básicas, Hook :: LexWrap, Prueba :: MockObject, Prueba :: Profundo, Prueba :: MockTime, Prueba :: WWW :: Mecanizar y muchos otros para pruebas avanzadas. Atributo :: Firma para verificar subparámetros. Carp :: Assert para la programación basada en contrato.

Devel :: Ebug :: Wx o Devel :: ptkdb (y pronto mejor soporte en Padre) se puede utilizar para una depuración más fácil.

13

Hay un montón de cosas por ahí para ayudarle a:

  • Devel::Trace - imprimir cada línea que se ejecuta
  • Carp::REPL - gota en un REPL * cuando el código emita una advertencia
  • Devel::ebug - una depurador que puede controlar desde el código de Perl
  • Enbugger - use depurador en el tiempo de ejecución independientemente de si su proceso se inició con la depuración
+0

* REPL = Leer, Evaluar, Imprimir Loop (== intérprete interactivo) –

+0

@j_random_hacker Gracias, estoy fuera gracias a YAPC. –

4

Dependiendo de lo que está haciendo, Log::Log4perl proporciona una manera fácil de gestionar el estilo 'impresión' de depuración particularmente en aplicaciones más grandes:

  • proporciona varios niveles de registro (depuración, información, error, advertencia , Fatal)
  • controlado desde archivos de configuración (fácil de depurar en el cuadro de desarrollo, solo errores en el cuadro de producción, por ejemplo)
  • configurable por secciones de su aplicación (ej. aplicación web en un archivo de registro en un nivel, las secuencias de comandos cron en otro a nivel de registro diferente)
  • configurables por clase - fáciles de calmar módulos ruidosos, o añadir una depuración detallada a algún lugar profundo dentro de una aplicación
+0

La mayoría de las personas usa Log :: Log4perl cuando lo hace Log :: Message (un módulo principal). – MkV

7

El las mejores ayudas para la depuración son pequeñas rutinas, alcances cortos, efectos secundarios limitados y muchas pruebas. Detener los errores antes de que nazcan.

0

Some Other methods

CGI::Dump 

Benchmark 

Command-line options 

__DATA__ & <DATA> 

$. 

__FILE__ & __LINE__ 

warn() & die() 
2

uso, Devel :: SimpleTrace, para el más elegante sin costuras sin estado-depuración.

perl -MDevel :: SimpleTrace -we'warn "main"; sub foo {advertir "externo"; sub {advertir "interno"}}; foo() ->()'

1

Yo generalmente uso

perl -d 

para la depuración.

También puede usar el complemento Eclipse Perl Integration (EPIC) para Eclipse. Ofrece un entorno de depuración rico disponible e integrado con el entorno de desarrollo EPIC Perl. Puedes usarlo y generalmente es útil.

1

Durante el desarrollo, me gusta incorporar sentencias printf en lugares estratégicos (no demasiados) realizadas a través de un indicador de depuración de esta manera:

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

donde el indicador de depuración se define en la parte superior del guión :

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

Ahora, en lugar de tener que recordar a comentar todas las líneas de printf, acabo de funciono con la escritura de la siguiente manera:

DEBUG=1 ./script.pl 

Después de la prueba, cuando todo está listo para la producción, las líneas de depuración se puede quitar:

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

Si no te gusta entonces perl -dDevel::REPL y Carp::REPL son dos buenas alternativas.

+0

lástima Devel :: REPL requiere el Moose de 400 libras (y varios módulos MooseX), y Carp :: REPL depende de Devel :: REPL – MkV

+0

¿Y esto es un problema porque ...? – singingfish

2

Personalmente, soy un gran fan de Smart::Comments. Hace que el trazado sea simple, sin necesidad de despojarlo tampoco.

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

Si Smart_Comments se ha establecido en el medio ambiente, las líneas comenzando con ### se convierten en la salida de depuración, con Dumper() utilizado automágicamente. Si la variable de entorno no está configurada, las cosas de depuración son completamente inertes.

Tiene un montón de características, y producirá barras de progreso, advertencias, condiciones de aborto, así como la salida de depuración anterior simple.

Las pruebas adecuadas son todas buenas, y no descarto una buena metodología de desarrollo de TDD, pero cuando intento llegar al fondo de un error existente, Smart :: Comments es el camino a seguir.

+0

Y es un filtro fuente, por lo tanto frágil. – MkV

3

Emacs, sin duda.

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 proporciona una manera fácil de insertar y activar/desactivar las instrucciones de impresión para la depuración.

La función d() imprime el nombre de su variable, su valor y su nombre de subrutina. La implementación se ha optimizado para minimizar las pulsaciones de teclas del programador.

Aquí es código de ejemplo para empezar:

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

Salida:

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 
} 

Muchas opciones están disponibles para personalizar la salida. La documentación completa se puede encontrar en CPAN.

Cuestiones relacionadas