Comment debugger avec le module Trace

Mise à jour: 19/07/2023
Version: 1.0
Author: Jean-Louis Bicquelet-Salaün
Location: http://jlbicquelet.free.fr
Copyright: (c) 2023 Jean-Louis BICQUELET-SALAÜN

equivalent sh -x en perl

Pour débugger en perl et avoir un équivalent du sh -x du shell, il faut le module b(Trace.pm).

Celui-ci se trouve sur le site CPAN (Comprehensive Perl Archive Network).

Pour ceux qui ne connaitrit pas, c'est un réseau complet d'archives Perl où l'on trouve des logiciels, de la documentation, des bibliothèques de fonctions, des utilitaires écrits en langage Perl, ou en autres langages (pourvu que ce soit accessible en Perl),

Le module se trouve sur https://metacpan.org/pod/Devel::Trace. @h1 installation

Deux manière de faire pour installer le module.

méthode sale : créer un répertoire Devel chez soit

Il faut créer un répertoire Devel (en respectant la case) puis copier dans ce répertoire le module Trace.pm et enfin forcer la variable PERLIB vers le répertoire que l'on vient de créer.

mkdir Devel
cp Trace.pm Devel
export PERL5LIB=.

méthode plus propre

installer le module dans un répertoire de la liste @INC. On peut trouver cette liste avec la commande perl -V.

  Built under linux
  Compiled at Sep 24 2021 16:10:58
  %ENV:
    PERL5LIB="."
  @INC:
    .
    /etc/perl
    /usr/local/lib/x86_64-linux-gnu/perl/5.32.1
    /usr/local/share/perl/5.32.1
    /usr/lib/x86_64-linux-gnu/perl5/5.32
    /usr/share/perl5
    /usr/lib/x86_64-linux-gnu/perl-base
    /usr/lib/x86_64-linux-gnu/perl/5.32
    /usr/share/perl/5.32Makefile.PL
    /usr/local/lib/site_perl

la méthode correcte

cons La manière d'installer un module perl sur son système (les méthodes présentées précédement sont destinées à une utilisation temporaire du module Trace) est la méthode classique basée sur le fichier Makefile.PL qui génère un fichier Makefile d'installation.

perl Makefile.PL
Checking if your kit is complete...
Looks good
Generating a Unix-style Makefile
Writing Makefile for Devel::Trace
Writing MYMETA.yml and MYMETA.json

make
cp demo.pl blib/lib/Devel/demo.pl
cp Trace.pm blib/lib/Devel/Trace.pm
Manifying 1 pod document

utilisation

Pour démontrer comment utiliser Trace on va écrire un script de test nommé test:

#!/usr/bin/perl
 
print "debut\n";
print "subroutine ", &sub(), " \n";
      
for (my $i = 0; $i <= 2; $i++) {
       print "$i\n";
}
exit 0;
 
 
sub sub {
  print "Dans la subroutine.\n";
  return 10;
}cons

L'exécution donne:

perl -d:Trace test
>> test:4: print "debut\n";
debut
>> test:5: print "subroutine ", &sub(), " \n";
>> test:14:   print "Dans la subroutine.\n";
Dans la subroutine.
>> test:15:   return 10;
subroutine 10 
>> test:7: for (my $i = 0; $i <= 2; $i++) {
>> test:8:        print "$i\n";
0
>> test:8:        print "$i\n";
1
>> test:8:        print "$i\n";
2
>> test:10: exit 0;

Il est possible de désactiver au sein du script le mode trace avec

$Devel::Trace::TRACE = 1;   # Enable
$Devel::Trace::TRACE = 0;   # Disable

ou

Devel::Trace::trace('on');  # Enable
Devel::Trace::trace('off'); # Disabl

Le script précédent transformé en

#!/usr/bin/perl
 
print "debut\n";

Devel::Trace::trace('off');
print "subroutine ", &sub(), " \n";
Devel::Trace::trace('on');

      
for (my $i = 0; $i <= 2; $i++) {
       print "$i\n";
}
exit 0;
 
 
sub sub {
  print "Dans la subroutine.\n";
  return 10;
}cons

Donne à l'exécution :

>> test:4: print "debut\n";
debut
>> test:6: Devel::Trace::trace('off');
>> Devel/Trace.pm:31:   my $arg = shift;
>> Devel/Trace.pm:32:   $arg = $tracearg{$arg} while exists $tracearg{$arg};
>> Devel/Trace.pm:33:   $TRACE = $arg;
Dans la subroutine.
subroutine 10 
>> test:11: for (my $i = 0; $i <= 2; $i++) {
>> test:12:        print "$i\n";
0
>> test:12:        print "$i\n";
1
>> test:12:        print "$i\n";
2te liste avec la commande perl -V.

  Built under linux
  Compiled at Sep 24 2021 16:10:58
  %ENV:
    PERL5LIB="."
  @INC:
    .
    /etc/perl
    /usr/local/lib/x86_64-linux-gnu/perl/5.32.1
    /usr/local/share/perl/5.32.1
    /usr/lib/x86_64-linux-gnu/perl5/5.32
    /usr/share/perl5
    /usr/lib/x86_64-linux-gnu/perl-base
    /usr/lib/x86_64-linux-gnu/perl/5.32
    /usr/share/perl/5.32Makefile.PL
    /usr/local/lib/site_perl

la méthode correcte

cons La manière d'installer un module perl sur son système (les méthodes présentées précédement sont destinées à une utilisation temporaire du module Trace) est la méthode classique basée sur le fichier Makefile.PL qui génère un fichier Makefile d'installation.

perl Makefile.PL
Checking if your kit is complete...
Looks good
Generating a Unix-style Makefile
Writing Makefile for Devel::Trace
Writing MYMETA.yml and MYMETA.json

make
cp demo.pl blib/lib/Devel/demo.pl
cp Trace.pm blib/lib/Devel/Trace.pm
Manifying 1 pod document

utilisation

Pour démontrer comment utiliser Trace on va écrire un script de test nommé test:

#!/usr/bin/perl
 
print "debut\n";
print "subroutine ", &sub(), " \n";
      
for (my $i = 0; $i <= 2; $i++) {
       print "$i\n";
}
exit 0;
 
 
sub sub {
  print "Dans la subroutine.\n";
  return 10;
}cons

L'exécution donne:

perl -d:Trace test
>> test:4: print "debut\n";
debut
>> test:5: print "subroutine ", &sub(), " \n";
>> test:14:   print "Dans la subroutine.\n";
Dans la subroutine.
>> test:15:   return 10;
subroutine 10 
>> test:7: for (my $i = 0; $i <= 2; $i++) {
>> test:8:        print "$i\n";
0
>> test:8:        print "$i\n";
1
>> test:8:        print "$i\n";
2
>> test:10: exit 0;

Il est possible de désactiver au sein du script le mode trace avec

$Devel::Trace::TRACE = 1;   # Enable
$Devel::Trace::TRACE = 0;   # Disable

ou

Devel::Trace::trace('on');  # Enable
Devel::Trace::trace('off'); # Disabl

Le script précédent transformé en

#!/usr/bin/perl
 
print "debut\n";

Devel::Trace::trace('off');
print "subroutine ", &sub(), " \n";
Devel::Trace::trace('on');

      
for (my $i = 0; $i <= 2; $i++) {
       print "$i\n";
}
exit 0;
 
 
sub sub {
  print "Dans la subroutine.\n";
  return 10;
}cons

Donne à l'exécution :

>> test:4: print "debut\n";
debut
>> test:6: Devel::Trace::trace('off');
>> Devel/Trace.pm:31:   my $arg = shift;
>> Devel/Trace.pm:32:   $arg = $tracearg{$arg} while exists $tracearg{$arg};
>> Devel/Trace.pm:33:   $TRACE = $arg;
Dans la subroutine.
subroutine 10 
>> test:11: for (my $i = 0; $i <= 2; $i++) {
>> test:12:        print "$i\n";
0
>> test:12:        print "$i\n";
1
>> test:12:        print "$i\n";
2
>> test:14: exit 0;

>> test:14: exit 0;