sentencia - ¿Cuáles son algunos buenos métodos de depuración de Perl?
sentencia perl (18)
Algunas personas usan declaraciones print
para ver qué sucede en las secciones de un programa que no están haciendo lo que pensaban que haría el código. (Es decir, como una forma de verificar lo que realmente está contenido en una variable en un punto dado de ejecución).
Dicho esto, la pregunta es bastante vaga. ¿Hay algo que intentes hacer con el que Data :: Dumper y perl -d
no están ayudando?
¿Hay alguna otra forma de depurar Perl aparte de Data::Dumper
y perl -d
?
Dependiendo de lo que esté haciendo, Log::Log4perl proporciona una manera fácil de administrar el estilo de "impresión" de la depuración, especialmente 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 (por ejemplo, aplicación web en un archivo de registro en un nivel, scripts cron en otro en un nivel de registro diferente)
- configurable por clase: módulos silenciosos y fáciles de silenciar, o agregar depuración detallada a un lugar profundo dentro de una aplicación
Durante el desarrollo, me gusta incorporar instrucciones printf en lugares estratégicos (no demasiados) que están habilitados con un indicador de depuración como este:
printf("h=''$h'', j=''$j'', ... (%d)/n", __LINE__) if $debug;
donde el indicador de depuración se define en la parte superior del script:
my $debug = $ENV{DEBUG} || 0;
Ahora, en lugar de tener que recordar comentar todas las líneas printf, solo ejecuto el script de la siguiente manera:
DEBUG=1 ./script.pl
Después de probar que todo está listo para producción, las líneas de depuración pueden eliminarse:
cat script.pl | grep -v ''if $debug;''
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.
Escribir pruebas en su mayoría puede disminuir el tiempo de depuración, creo.
Generalmente uso
perl -d
para la depuración
También puede usar el complemento Eclipse Perl Integration (EPIC) para Eclipse. Ofrece un amplio entorno de depuración disponible e integrado con el entorno de desarrollo EPIC Perl. Puedes usarlo y generalmente es útil.
Hay muchas cosas para ayudarte:
- Devel::Trace - imprime cada línea que ejecuta
- Carp::REPL : caída en REPL
*
cuando el código arroja una advertencia - Devel::ebug - un depurador que puedes controlar desde el código Perl
- Enbugger : use el depurador en el tiempo de ejecución independientemente de si el proceso se inició con la depuración
Las mejores ayudas para la depuración son rutinas pequeñas, alcances cortos, efectos secundarios limitados y muchas pruebas. Detener los errores antes de que nazcan.
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. Vea la publicación de blog de Tim bunce para obtener una descripción interesante.
Mi rango habitual de herramientas es:
- print statements y Data :: Dumper para casos simples
- perl -d
Eso es usualmente 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) uso Devel::NYTProf .
Personalmente, soy un gran fanático 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 entorno, las líneas que comienzan con ### se convierten en salidas de depuración, con Dumper()
utilizado de forma automática. 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 salida de depuración antigua simple.
Las pruebas apropiadas son 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.
Si no te gusta perl -d
entonces Devel::REPL y Carp::REPL son buenas alternativas.
Test :: More para escribir pruebas básicas, Hook :: LexWrap, Test :: MockObject, Test :: Deep, Test :: MockTime, Test :: WWW :: Mechanize y muchos otros para pruebas avanzadas. Atributo :: Firma para verificar subparámetros. Carp :: Assert para la programación basada en contrato.
Se puede usar Devel :: Ebug :: Wx o Devel :: ptkdb (y pronto mejor soporte en Padre) para una depuración más fácil.
Uso ActiveState Komodo para la depuración paso a paso.
Eclipse tiene un depurador paso a paso para su plugin EPIC .
Personalmente prefiero la versión de 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.
Utilice, Devel :: SimpleTrace, para la eliminación de errores sin estado más elegante sin apariencia.
perl -MDevel :: SimpleTrace -we''warn "main"; sub foo {advertir "externo"; sub {advertir "interno"}}; foo () -> () ''
CGI::Dump
Benchmark
Command-line options
__DATA__ & <DATA>
$.
__FILE__ & __LINE__
warn() & die()
Herramientas disponibles para la depuración
Hay varias herramientas disponibles en Perl para la depuración y tareas similares.
Depurador de línea de comandos incorporado.
perl -d yourcode.pl
Depurador gráfico basado en Perl / Tk por Andrew E. Page.
Esta es una herramienta gratuita que se ejecuta tanto en Linux como en Windows escrita en Lisp . El código fuente no está disponible.
Rx: un depurador Regex para Perl
El depurador Perl Regex y un artículo escrito por Mark Jason Dominus.
Debug::Statements proporciona una manera fácil de insertar y habilitar / deshabilitar declaraciones 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í hay un código de muestra para comenzar:
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
}
Hay muchas opciones disponibles para personalizar la salida. La documentación completa se puede encontrar en CPAN.