Pregunta Cómo obtener la salida de rastreo solo desde el paquete principal de un programa Perl


Me gustaría rastrear mi script Perl, pero solo el código en el main paquete, y redirigir la salida a un archivo.

Al iniciar el script con perl -d script.pl entra en modo interactivo.

Yo he tratado

perl -d:Trace perl_05.pl 2&> output.log

Pero esto también rastrea todas las subrutinas y módulos que no quiero.

Estoy buscando algo así como la fiesta set -o xtrace o sh -x.


6
2018-05-03 06:30


origen


Respuestas:


El artículo Rastrea tus programas de Perl atiende sus inquietudes con respecto a la cantidad de rastros y le muestra una forma de ajustar la salida para que solo rastree lo que desea.

Puede crear su propio módulo descartable para rastrear exactamente lo que desea. Dado que el directorio actual por lo general ya está en @INC, puedes crear un Devel/MyTrace.pm.

Léelo completamente para ver cómo el autor modifica el comportamiento predeterminado de la función de rastreo para generar primero las trazas en un archivo, luego en STDERR también y finalmente limita la salida para simplemente rastrear el archivo primario.

Puede ir un paso más allá para excluir todo el código, excepto el archivo principal:

use v5.10;
use autodie;

BEGIN {

my $trace_file = $ENV{TRACE_FILE} // "mytrace.$$";
print STDERR "Saving trace to $trace_file\n";

my $fh = do {
     if( $trace_file eq '-'      ) { \*STDOUT }
  elsif( $trace_file eq 'STDERR' ) { \*STDERR }
  else { 
      open my $fh, '>>', $trace_file;
      $fh;
      }
  };

sub DB::DB {
  my( $package, $file, $line ) = caller;
  return unless $file eq $0;
  my $code = \@{"::_<$file"};
  print $fh "[@{[time]}] $file $l $code->[$line]";
  }
}

1;

Ese último trozo de código es el que es especialmente interesante para ti. Hace exactamente lo que quieres.


6
2018-05-03 08:39



Usando Perl con Devel::DumpTrace es muy parecido a usar bash -x. Me gusta bash -x, Devel::DumpTrace amplía y genera valores de variables para darle una idea de lo que estaba haciendo su script, no solo de dónde lo está haciendo.

También tiene la función que está buscando: habilitar y deshabilitar el rastreo en paquetes específicos. Para su caso de uso, lo ejecutaría como

perl -d:DumpTrace=-.*,+main my_script.pl

o

perl -d:DumpTrace=-.* my_script.pl

-.* significa "excluir todos los paquetes que coincidan" /^.*$/ de seguimiento ", es decir, todos los paquetes. +main significa "incluir paquete main en el rastreo ".

El resultado predeterminado puede ser bastante detallado. Si desea menos salida que eso, puede especificar quiet modo:

perl -d:DumpTrace=quiet,-.*,+main my_script.pl

(Soy el autor de Devel::DumpTrace)


5
2018-05-03 15:18