Se muestra un resumen de comandos más usados del depurador de Perl, así como algunas técnicas para hacer las cosas más sencillas.

Enlaces

Referencia Tutoriales Preguntas Cpan
Funciones Operadores Variables Depurador

Depurador. Resumen de Comandos y Notas Avanzadas

Conviene tener instalados los paquetes PadWalker y Term::ReadLine::Perl

cpan Term::ReadLine::Perl ## Habilita las teclas flecha y borrado atrás ( Backspace ).
                          ## Evita caracteres ^[[A", "^[[C", "^[[B", "^[[D"", "^H"
yum install perl-PadWalker

Invocación

perl -d programa.pl
perl -de 0 # Sin programa. Útil para probar expresiones.

Resumen de comandos más usados.

a [línea] Accióna print 4Imprime 4 antes de ejecutar la línea actual
b ParadabEn línea actual
b 110En línea 110
b calcularEn subrutina calcular
b 110 /Hola/En línea 110 si $_ =~ /Hola/
B Borrar ParadaB *Todas las paradas
B 110en línea 110
c Continuarc 110Ir a línea 110 y parar
c calcularIr a subrutina calcular y parar
L [a|b|w] ListarLMuestra paradas, acciones y observaciones
v Mostrar códigovAlrededor de la línea actual
v 100Alrededor de la línea 100
l Lista líneasl 100-110Desde la línea 100 a la 110
l 100+5Muestra 5 líneas desde la línea 100
l calcularMuestra la primera ventana de código de la subrutina calcular
. Mueve el puntero del depurador.Lleva el puntero del depurador a la línea a ejecutar
s Siguiente instrucciónsSiguiente instrucción, introduciéndose en subrutina
n Siguiente instrucciónnSiguiente instrucción, SIN introducirse en subrutina
r Salir de subrutinarContinuar programa hasta salir de la subrutina actual
CR Retorno de CarroCRRepetir último comando n o s
p Muestra expresiónp 5 + 510
p $aValor de la variable $a
p $a > 51 si $a vale 5, nada si no
x [nivel] Muestra estructura recursivax $avalor de $a
x @miTablaValores de la Tabla
x \@miTablaValores de la Referencia
x 2 \%claves2 hasta dos niveles del valor claves
V [paquete[vars]]V DB filename linevariables $DB::filename y $DB::line
V DB ~filevariables en paquete DB que contienen file en el nombre
V DB !filevariables en DB que no contienen file en el nombre
X
y [level[vars]]
S Mostrar subrutinas por patrónS calcuSubrutinas que contienen calcu en el nombre
M Muestra los módulos cargadosMMódulos y versiones
m paquetem Configmuestra los métodos del paquete Config
o opción=valoroMuestra el valor de todas las opciones
o windowSize=15Cambia el número de líneas de los lístados de código ( 10 por defecto )
o arrayDepth=5Imprime sólo los primeros 5 elementos de una tabla
source ficherosource comandos.txtlee el fichero comandos.txt y lo interpreta como comandos del depurador
{{ acción{{ vSe ejecuta la acción del depurador "v" ( mostrar líneas alrededor ) cada vez que se muestra el símbolo del programa
{*{*Borra todas las acciones establecidas con {{
RRReinicia el programa en el depurador
qqSalir del depurador

B No hay comando para borrar paradas en subrutinas. Ver paradas con L y utilizar el número de línea.

Ver valores: "p", "x", "V", "X" y "y". "p" muestra expresiones, y equivale a print. "x" muestra estructuras anidadas recursivamente, V muestra las variables de un paquete, que corresponden a un patrón, ( pueden ser todas ). "V" equivale a aplicar "X" en el paquete actual. "y" muestra la variables léxicas en el entorno actual, (variables definidas con "my") o en el nivel anterior especificado por el parámetro, requiere que el paquete PadWalker esté instalado.

Configurando el depurador. Fichero .perldb

El depurador busca el fichero ".perldb", en el directorio actual del usuario, y si no, en su directorio raiz ($HOME). Por razones de seguridad ha de ser propiedad del propio usuario, o del superusuario, y permisos de escritura sólo del propietario. Este fichero permite definir opciones en el depurador equivalentes al comando "o" del depurador. eg "o windowSize=15".

.perldb puede contener una subrutina llamada "afterinit". Si existe, esta función se ejecuta después de inicializarse el depurador. Voy a utilizar esa propiedad para configurar una inicialización independiente por cada fichero perl.

Utilización

Añado, substituyo o modifico este código en el fichero $HOME/.perldb. Esto es, incluir la subrutina initFile, y llamarla desde la subrutina afterinit.

sub afterinit {
  initFile();
}
sub initFile {
  my ($file)= ($0 =~ /([^\/]+)$/);
  if ($file) {
    $file=~s/\.[^.]*$//;
    $file .= '.pldb';
    if ( -r $file ) {
      do { print "$file No ejecutado. Permisos incorrectos.\n"; return;} if (stat($file))[2] & 0022;
      print "Cargando $file\n"; 
      push @DB::typeahead,"source $file";  
    } else { 
      print "No se ha encontrado fichero de configuración $file";
    }
  }
}

initFile busca en el directorio actual, un fichero con el mismo nombre que el programa depurado ( contenido en la variable $0 ) con la extensión .pldb. Si, lo encuentra, comprueba que sólo tiene permisos de escritura por parte del propietario, y lo carga con el comando source del depurador. De esta forma, puedo tener un fichero de comandos diferente por fichero perl, sin necesidad de cambiar el fichero .perldb.

Por seguridad, el fichero .pldb sólo puede escribirse por el propietario. e.g. "chmod 0644 miprueba.pl".

Un ejemplo de comandos. Quiero depurar el fichero "miprueba.pl" y pongo estos comandos de depuración en el fichero "miprueba.pldb". El depurador es el propio perl, así que puedo utilizar el carácter # para poner comentarios.

{*    # Borra todos los comandos establecidos con {{ 
{{ v  # Cada vez que aparece el símbolo del programa, mostrar las líneas de alrededor.
b 200 # Parada en la línea 200
o windowSize=12 # Imprime 12 líneas de código con los comandos v, o l.

Otro ejemplo. Para poder poner una parada en un módulo, hace falta que esté cargado. El depurador continúa hasta la línea 3, antes de poner la parada, ya que hasta entonces la función Display::display, incluida con la sentencia 'require' no puede ser reconocida.

#!/perl
require Display;
my $pelicula;

{*
{{v
c 3
b Display::display