IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2012
    Messages : 3 612
    Points : 12 464
    Points
    12 464
    Billets dans le blog
    1
    Par défaut [FAQ] Nouvelle section ou sous-section sur le débogage sous Perl et sur le debugger Perl
    Bonjour,

    je voulais ajouter une question/réponse sur une utilisation un peu avancée du debugger Perl, mais je m'aperçois que, sauf erreur, il n'y a pas de section de la FAQ consacrée à ce sujet (en tous cas, je ne l'ai pas trouvée). Je propose donc de créer une nouvelle section ou sous-section consacrée non pas au debugger Perl, mais plus généralement au débogage sous Perl (car il y a d'autres techniques que le débugger pour "déverminer" un programme). Je me ferai ensuite un plaisir de rédiger éventuellement quelques questions de base sur ce sujet.

    Je pense que ce serait utile pour pouvoir renvoyer vers la FAQ les utilisateurs qui posent des questions de ce genre: "Je ne comprends pas, mon programme tourne, mais n'affiche pas les résultats que j'attends. Que se passe-t-il?".

    Qu'en penses-tu, Djibril?

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    19 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 19 671
    Points : 498 412
    Points
    498 412
    Par défaut
    Merci pour ta proposition Lolo78. Je t'ai créé une section Débogage sous Perl.
    Tu peux maintenant l'alimenter avec de nouvelles questions que je validerai pour les afficher.

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2012
    Messages : 3 612
    Points : 12 464
    Points
    12 464
    Billets dans le blog
    1
    Par défaut [FAQ] Comment arrêter le debugger Perl sur un warning du genre "Use of uninitialized value ..."
    On a parfois beaucoup de difficulté à résoudre un warning "Use of uninitialized value ...". Perl indique la ligne de code concernée et éventuellement la ligne du fichier lu où cela arrive, mais cela ne suffit souvent pas, en particulier quand cet avertissement est émis pour seulement quelques éléments d'une longue liste ou quelque rares fois dans une grosse boucle while ou foreach. Même sous le debugger, il n'est pas possible d'exécuter pas à pas une boucle contenant plusieurs milliers, voire plusieurs millions, d'itérations.

    Une astuce permet de demander au debugger de s'arrêter sur l'émission d'un warning de ce type (ou autre, d'ailleurs).

    Considérons le programme suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    use strict;
    use warnings;
     
    my @array = 0..5;
    $array[$_] = $_ for 7..10;
     
    foreach (@array) {
    	my $count = $_ + 5;
    	print $count, "\n";
    }
    print "end\n";
    Avant d'entrer dans la boucle foreach, le tableau @array a le contenu suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      DB<2> x @array
    0  0
    1  1
    2  2
    3  3
    4  4
    5  5
    6  undef
    7  7
    8  8
    9  9
    10  10
    On voit que le septième élément du tableau (indice 6) n'est pas défini.

    A l'exécution, cela donne le warning suivant et une valeur probablement fausse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ perl  test_debug_warn.pl
    5
    6
    7
    8
    9
    10
    Use of uninitialized value $_ in addition (+) at test_debug_warn.pl line 11.
    5
    12
    13
    14
    15
    end
    L'utilisation de debugger n'aide pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    $ perl -d test_debug_warn.pl
     
    Loading DB routines from perl5db.pl version 1.33
    Editor support available.
     
    Enter h or `h h' for help, or `man perldebug' for more help.
     
    main::(test_debug_warn.pl:6):   my @array = 0..5;
      DB<1> c
    5
    6
    7
    8
    9
    10
    Use of uninitialized value $_ in addition (+) at test_debug_warn.pl line 11.
     at test_debug_warn.pl line 11
    5
    12
    13
    14
    15
    end
    Debugged program terminated.  Use q to quit or R to restart,
      use o inhibit_exit to avoid stopping after program termination,
      h q, h R or h o to get additional info.
    Avec une boucle de 11 itérations, on peut certes aller pas à pas jusqu'à la ligne posant problème afin d'examiner le contexte et l'état des variables au moment de l'émission du warning, mais ce n'est plus possible pour une boucle contenant un grand nombre d'itérations. C'est là que l'on voudrait demander au debugger de s'arrêter au moment du warning.

    Il suffit pour cela de configurer le debugger pour qu'il s'arrête sur les warnings, en plaçant dans le répertoire courant ou dans le répertoire de l'utilisateur un fichier nommé .perldb (c'est un fichier de configuration du debugger chargé lors du lancemenr du debugger) et contenant le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    sub afterinit 
    {
        $::SIG{'__WARN__'} = sub {
            my $warning = shift;
            if ( $warning =~ m{\s at \s \S+ \s line \s \d+ \. $}xms ) {
                $DB::single = 1;    # point d'arrêt, le debugger s'arrête ici
            }
            warn $warning;
        };
        print "sigwarn handler installed!\n";
        return;
    }
    Sans entrer dans le détail, disons que cela ajoute un point d'arrêt à la fonction de warning du debugger.

    Maintenant, le debugger s'arrête juste après l'émission du warning, ce qui permet d'examiner le contenu de la variable $_ a ce moment_là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $ perl -d test_debug_warn.pl
     
    Loading DB routines from perl5db.pl version 1.33
    Editor support available.
     
    Enter h or `h h' for help, or `man perldebug' for more help.
     
    sigwarn handler installed!
    main::(test_debug_warn.pl:6):   my @array = 0..5;
      DB<1> c
    5
    6
    7
    8
    9
    10
    Use of uninitialized value $_ in addition (+) at test_debug_warn.pl line 11.
    main::(test_debug_warn.pl:12):          print $count, "\n";
      DB<1> x $_
    0  undef

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2012
    Messages : 3 612
    Points : 12 464
    Points
    12 464
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par djibril Voir le message
    Merci pour ta proposition Lolo78. Je t'ai créé une section Débogage sous Perl.
    Tu peux maintenant l'alimenter avec de nouvelles questions que je validerai pour les afficher.
    OK, merci Djibril, j'ai rédigé la question "avancée" dont je parlais ici avant de voir ton message, je ferai les autres plus "élémentaires" directement dans la section que tu as créée.

    Et j'ajouterai éventuellement directement celle ci-dessus.

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    19 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 19 671
    Points : 498 412
    Points
    498 412
    Par défaut

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2012
    Messages : 3 612
    Points : 12 464
    Points
    12 464
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    j'ai saisi une première question sur le débogage dans la rubrique concernée, mais quand j'ai validé, j'ai eu un message d'erreur (erreur de redirection) et j'ai perdu tout ce que je venais de rédiger.

    Djibril, tu y as accès, ou elle est définitivement perdue?


  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    19 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 19 671
    Points : 498 412
    Points
    498 412
    Par défaut
    Je n'ai rien

  8. #8
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2012
    Messages : 3 612
    Points : 12 464
    Points
    12 464
    Billets dans le blog
    1
    Par défaut
    Ah zut, alors. Bon, yapluka refaire.

  9. #9
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    19 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 19 671
    Points : 498 412
    Points
    498 412
    Par défaut
    Fais un petit test juste pour voir si c'est ok.

  10. #10
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2012
    Messages : 3 612
    Points : 12 464
    Points
    12 464
    Billets dans le blog
    1
    Par défaut
    Bon, j'ai essayé une seconde fois, ça n'a vraiment pas l'air de marcher (un problème de droits, peut-être), même message d'erreur. Sauf que cette fois, j'ai pris la précaution de sauvegarder mon texte et son formatage.

    C'est très énervant de refaire un truc comme ça, on a presque toujours l'impression de faire un truc moins bien que le premier jet, même si ce n'est sans doute pas vrai.

    Voici le post sur le sujet:

    ________

    La toute première chose à faire, avant quoi que ce soit d'autre, est d'assurer que vous donniez un grand service à vous-même en demandant à Perl de vous aider à trouver des problèmes éventuels dans votre code. En utilisant le mode strict et les warnings, vous demandez au compilateur et à l'interpréteur Perl de détecter au plus vite pour vous d'éventuelles erreurs, ce qui peut vous faire gagner un temps précieux. Vous devez utiliser les pragmas strict et warnings pour tout programme Perl de plus d'une ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #!/usr/bin/perl
    use strict;
    use warnings;
    Ensuite, la méthode la plus simple et la plus commune pour déboguer un programme, dans pratiquement n'importe quel langage de programmation existant, est d'afficher à l'écran (ou parfois d'imprimer dans un fichier) le contenu des variables, le déroulement d'un programme (tracer les appels de fonctions ou de méthodes, les choix faits par le programme dans les conditions de type if ... elsif ... else, les entrées dans les boucles et le nombre d'itérations, etc.), la valeur de retour des appels de fonctions externes ou systèmes, etc. Par exemple, pour connaître la valeur d'une variable à un moment donné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print "Le contenu de la variable value est : $value \n";
    Toutefois, il se peut que la variable $value contienne au début ou surtout à la fin des caractères invisibles (espaces blancs, tabulations, retours à la ligne) qui peuvent être à l'origine de bogues assez coriaces à identifier. Il est donc généralement préférable d'"encadrer" la variable avec des caractères permettant de détecter la présence de ces caractères invisibles. Par exemple avec des crochets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $value = "toto  ";
    # ...
    print "Le contenu de la variable value est : [$value] \n"; # imprime : "Le contenu de la variable value est : [toto  ]".
    Cette fois, les espaces invisibles à la fin de la variable sont détectables et expliquent un dysfonctionnement d'une comparaison.

    Dans le cas de variables contenant des structures de données plus complexes (tableaux, tables de hachage, tableaux de hachages, hachages de tableaux, etc.), le module Data:umper permet d'afficher visuellement la structure de données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    use Data::Dumper;
    # ...
    print "Le contenu du hachage est: ", Dumper( \%hachage ), "\n";
    Perl est livré avec un debugger symbolique interactif qui permet de dérouler le fonctionnement d'un programme instruction par instruction (pas à pas), de poser des points d'arrêt ou de surveiller le changement d'une variable, de lire à n'importe quel moment le contenu d'une variable. pour invoquer ce debugger, il suffit d'utiliser l'option -d de la ligne de commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    perl -d mon_programme.pl
    Beaucoup de programmeurs, y compris des développeurs expérimentés parfois, semblent redouter l'utilisation d'un debugger (quel que soit le langage), semblant penser que c'est un instrument du passé, datant de l'époque où l'on écrivait des programmes cryptiques en C ou en assembler. Ils ont bien tort parce que, au moins dans le cas du debugger Perl, c'est vraiment très facile à utiliser. Et c'est extraordinairement puissant pour résoudre les bogues particulièrement difficiles à analyser.

    Le debugger Perl permet aussi d'ouvrir des sessions Perl interactives permettant de vérifier le bon fonctionnement de commandes complexes ou de tester en direct des expressions régulières alambiquées. Rien que pour ça, apprendre à utiliser le debugger est un vrai plus. On peut tester en direct à la ligne de commande la ligne de ^programme que l'on envisage d'utiliser. Le gain de temps peut être considérable.

    Nous nous arrêterons ici pour cette première question, mais beaucoup ds questions abordées rapidement ci-dessus seront abordées plus en détail dans les questions suivantes. Et d'autres techniques pourront être abordées en supplément ultérieurement.

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    19 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 19 671
    Points : 498 412
    Points
    498 412
    Par défaut
    J'ai intégré la question et je t'ai mis rédacteur de la fAQ, donc tu va pouvoir y poster des questions. Tu aurais dû pouvoir mais bon y a un bogue.

  12. #12
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2012
    Messages : 3 612
    Points : 12 464
    Points
    12 464
    Billets dans le blog
    1
    Par défaut
    OK, Djibril, merci.

    PS: euh, je viens de regarder, ce n'est pas le bon titre, mais c'est de ma faute, je n'avais pas donné de titre.

    Le titre, c'était: "Comment déboguer mon programme Perl?"

  13. #13
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2012
    Messages : 3 612
    Points : 12 464
    Points
    12 464
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    dans le sommaire de la FAQ, le lien vers la section sur le débogage sous Perl semble avoir disparu. Du coup il est presque inaccessible.

  14. #14
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    19 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 19 671
    Points : 498 412
    Points
    498 412
    Par défaut
    Pourtant, je le vois bien en position 6 moi

  15. #15
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2012
    Messages : 3 612
    Points : 12 464
    Points
    12 464
    Billets dans le blog
    1
    Par défaut
    Ah oui, c'est vrai, ça y est.

    Cela semble dépendre de par où on passe pour u accéder. Se peut-il qu'il y ait deux sommaires distincts des FAQ Perl? Hier, sur un autre PC, je ne parvenais pas à le trouver: en passant par un autre chemin, je tombais sur un sommaire où le debogage sous Perl ne figurait pas. Ou alors j'avais fumé la moquette à cause d'un certain quart de finale... Dans ce cas, excuse-moi.

    Si je retombe dessus, je noterai le lien.

  16. #16
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    19 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 19 671
    Points : 498 412
    Points
    498 412
    Par défaut
    Oui, c'était de ma faute, l'ancienne FAQ résidait encore. Maintenant, le souci est résolu, tu n'as pas fumé !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FAQ] Questions sur le débogage sous Perl
    Par Lolo78 dans le forum Contribuez
    Réponses: 7
    Dernier message: 14/07/2014, 21h51
  2. Réponses: 4
    Dernier message: 22/01/2008, 17h58
  3. [FAQ] court précis sur les instanciations sous VB6
    Par Vld44 dans le forum Vos contributions VB6
    Réponses: 3
    Dernier message: 20/06/2007, 15h45
  4. sous-section Linux Kernel dans la section développement Linux
    Par kromartien dans le forum Evolutions du club
    Réponses: 1
    Dernier message: 13/04/2007, 10h36
  5. [SQL Lite][Débutant] Sections et sous sections
    Par agent007se dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/06/2006, 09h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo