• Publicidad

Depurado de programas

Aprende Perl

Depurado de programas

Notapor explorer » 2006-06-02 15:37 @692

Muchas veces , en nuestros programas, no sabemos por dónde andan, qué están haciendo, o cuáles son los valores de las variables.

La solución más habitual es... poner prints:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "DEBUG: Empezando el bucle...\n";
foreach my $tarea ( @pendientes ) {
    print "DEBUG:    Haciendo la tarea $tarea\n";
    # procesando la $tarea
}
print "DEBUG: Fin del bucle\n";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
El código se hace un poco más largo, pero al menos sabemos qué está haciendo.

Cuando terminemos el programa y comprobemos que funciona, nos tocará quitar o comentar los prints...

Claro que... ¿y si descubrimos más tarde que el programa sigue fallando? Tenemos que volver a poner los prints... o descomentar las líneas. Mucho trabajo...

¿Qué podemos hacer?

Una forma sencilla de resolverlo, sin tener que ensuciar mucho nuestro código, es agregar una condición a nuestros prints.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $debug = 1;

print "DEBUG: Empezando el bucle...\n"           if $debug;
foreach my $tarea ( @pendientes ) {
    print "DEBUG:    Haciendo la tarea $tarea\n" if $debug;
    # procesando la $tarea
}
print "DEBUG: Fin del bucle\n"                   if $debug;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De esta manera, según pongamos un '1' o '0' en la línea donde definimos la variable $debug, se ejecutarán las líneas con los prints, o no.

Una forma más bonita de hacerle es usando constantes. Porque, naturalmente, el valor de la variable $debug no queremos que cambie a lo largo de todo el programa (hay excepciones, como en los casos en los que queremos tracear una parte de un programa y otra no).

Nuestro código quedaría así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use constant DEBUG => 1;

print "DEBUG: Empezando el bucle...\n"           if DEBUG;
foreach my $tarea ( @pendientes ) {
    print "DEBUG:    Haciendo la tarea $tarea\n" if DEBUG;
    # procesando la $tarea
}
print "DEBUG: Fin del bucle\n"                   if DEBUG;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si usamos de forma normal algún módulo como Sysadm::Install, podemos incluso dejarlo un poco más sencillo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Sysadm::Install qw(say);
use constant DEBUG => 1;

say "DEBUG: Empezando el bucle..."           if DEBUG;
foreach my $tarea ( @pendientes ) {
    say "DEBUG:    Haciendo la tarea $tarea" if DEBUG;
    # procesando la $tarea
}
say "DEBUG: Fin del bucle"                   if DEBUG;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero sólo merece la pena si usamos say para todas las salidas del programa.

Más profesional es usar un módulo como Log::Log4Perl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init( $DEBUG );

DEBUG "Empezando el bucle...";
foreach my $tarea ( @pendientes ) {
    DEBUG "  Haciendo la tarea $tarea";
    # procesando la $tarea
}
DEBUG "Fin del bucle";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Este módulo es una auténtica gozada. Permite que podamos sacar mensajes de depurado de nuestro programa según el nivel de urgencia.

Por ejemplo, una vez que comprobemos que el programa va funcionando bien, podemos ir reduciendo el nivel de detalle de los mensajes, con sólo cambiar $DEBUG por $INFO, $WARN, $ERROR o $FATAL. En el ejemplo anterior, si cambiamos $DEBUG por $ERROR, ya no veremos salir los mensajes.

Y también podemos sacar los mensajes a pantalla o a fichero o a los dos a la vez. Y configurar el depurado con ficheros de configuración externos (podemos, en una línea, decidir que todos nuestros programas en producción generen salida de depurado o no). Podemos definir plantillas para decir cómo será el formato de los ficheros que escribirá, o morir de forma elegante:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
LOGDIE("No hay tareas que hacer!") if  !@pendiente;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2008-05-14 13:08 @589, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Notapor monoswim » 2006-06-05 07:13 @342

Muy bueno el mini tutorial...Estaría bueno que lo coloquen en la sección de tutoriales, yo ya había escrito uno sopbre el tema hace mucho, pero este se le complementa perfectamente...

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires


Volver a Formación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados

cron