Avez-vous une question? (216) 97 656 803 hajjriadh@gmail.com
JavaScript

Déboguer avec les points d'arrêt (DevTools)

Apprenez à déboguer un programme JavaScript avec les points d'arrêt des DevTools : pause sur une ligne, exécution pas à pas (F8, F10, F11), observation des variables avec Scope, Watch et Call Stack, p...

0 chapitres 0 QCM Accès gratuit
Dans cet article

À propos de ce cours

Apprenez à déboguer un programme JavaScript avec les points d'arrêt des DevTools : pause sur une ligne, exécution pas à pas (F8, F10, F11), observation des variables avec Scope, Watch et Call Stack, points d'arrêt conditionnels, logpoints, instruction debugger, points d'arrêt sur événements et sur le DOM. Avec un exemple complet de bug de logique et des activités pratiques corrigées.
  1. Objectifs

    • Comprendre l'intérêt d'un point d'arrêt par rapport à console.log.
    • Poser un point d'arrêt et exécuter le code pas à pas dans l'onglet Sources.
    • Observer les variables (Scope, Watch) et la pile d'appels (Call Stack).
    • Utiliser les points d'arrêt conditionnels, les logpoints, l'instruction debugger et les points d'arrêt sur événements et sur le DOM.
  2. Pourquoi des points d'arrêt ?

    • Avec console.log, il faut deviner où afficher quoi, modifier le code, recharger… puis tout supprimer à la fin.
    • Un point d'arrêt (breakpoint) met le programme en pause sur une ligne choisie. Pendant la pause, on voit toutes les variables, on avance ligne par ligne et on observe l'effet de chaque instruction, sans modifier le code.
    • C'est l'outil idéal pour les bugs de logique: ceux qui ne produisent aucune erreur mais un résultat faux.
  3. Le panneau Sources (Débogueur dans Firefox)

  4. Panneau Sources des DevTools : point d'arrêt, Watch, Scope, Call Stack et boutons de pas à pas

  • À gauche : l'arborescence des fichiers de la page (ouvrir rapidement un fichier : Ctrl + P).
  • Au centre : le code du fichier ouvert. Cliquer sur un numéro de ligne pose un point d'arrêt (marqueur bleu) ; recliquer le retire.
  • À droite : les boutons de contrôle et les panneaux d'observation.
  • Avancer pas à pas

  • BoutonRaccourciEffet
    Reprendre (▶)F8Continue l'exécution jusqu'au prochain point d'arrêt.
    Pas à pas principal (Step over)F10Exécute la ligne courante, sans entrer dans les fonctions appelées.
    Pas à pas détaillé (Step into)F11Entre dans la fonction appelée sur la ligne courante.
    Pas à pas sortant (Step out)Maj + F11Termine la fonction en cours et revient à la ligne qui l'a appelée.
  • Observer les valeurs

    • Survol: pendant la pause, passer la souris sur une variable affiche sa valeur.
    • Scope (Portée) : toutes les variables locales, de fermeture (closure) et globales à cet instant.
    • Watch (Expressions espionnées) : on y ajoute une expression (total, notes.length, total / notes.length) recalculée à chaque pas.
    • Call Stack (Pile d'appels) : la chaîne des fonctions qui ont mené à cette ligne. Cliquer sur une ligne de la pile affiche son contexte.
    • Pendant la pause, la console travaille dans le contexte de la ligne courante : on peut y taper le nom d'une variable locale ou même la modifier.
  • Exemple : trouver un bug de logique

    • Ce programme doit afficher la moyenne 12.67, mais il affiche 4719.67… et aucune erreur n'apparaît dans la console !
    <!-- index.html -->
    <p>Moyenne : <strong id="moyenne"></strong></p>
    <script src="js/app.js" defer></script>
    // js/app.js
    const notesSaisies = ["14", "15", "9"]; // valeurs lues dans un formulaire : ce sont des chaînes
    
    function calculerMoyenne(notes) {
      let total = 0;
      for (const n of notes) {
        total += n;
      }
      return total / notes.length;
    }
    
    function afficher() {
      const moyenne = calculerMoyenne(notesSaisies);
      document.querySelector("#moyenne").textContent = moyenne.toFixed(2);
    }
    
    afficher();
    1. Ouvrez l'onglet Sources, ouvrez app.js et posez un point d'arrêt sur la ligne total += n;.
    2. Rechargez la page : l'exécution s'arrête sur cette ligne.
    3. Survolez n: sa valeur est "14", entre guillemets, donc une chaîne.
    4. Appuyez sur F10 puis F8 plusieurs fois en observant total dans Scope : "014", puis "01415", puis "014159". Le + concatène des chaînes au lieu d'additionner.
    5. Correction : convertir chaque note en nombre, total += Number(n);. La moyenne affichée devient 12.67.
    • Explication du résultat faux : à la fin de la boucle, total vaut la chaîne "014159". La division "014159" / 3 convertit cette chaîne en nombre (14159), d'où 4719.67. Seule l'observation des valeurs réelles permettait de le comprendre rapidement.
    1. Les autres types de points d'arrêt

      • Point d'arrêt conditionnel: clic droit sur le numéro de ligne → Ajouter un point d'arrêt conditionnel → saisir une condition, par exemple n === "9". La pause n'a lieu que si la condition est vraie : idéal dans une boucle de 1000 tours.
      • Logpoint (point de journalisation) : clic droit → Ajouter un logpoint → saisir "total =", total. Le message s'affiche dans la console sans mettre en pause et sans modifier le code.
      • L'instruction debugger; écrite dans le code met en pause à cet endroit quand les DevTools sont ouvertes. Pensez à la retirer avant de livrer.
      • Points d'arrêt sur événements (Event Listener Breakpoints) : dans le panneau de droite, cochez par exemple Mouse → click: la pause se fait dès qu'un gestionnaire de clic s'exécute, même si vous ne savez pas dans quel fichier il se trouve.
      • Points d'arrêt sur le DOM: dans l'onglet Éléments, clic droit sur un élément → Arrêt sur → modification de sous-arbre, modification d'attribut ou suppression du nœud. Utile pour savoir quel script modifie un élément.
      • Points d'arrêt XHR/fetch: pause quand une requête vers une adresse donnée est envoyée.
      • Pause sur les exceptions: l'option Pause on exceptions arrête l'exécution à l'endroit exact où une erreur se produit.
      function verifierNote(note) {
        if (note < 0 || note > 20) {
          debugger; // pause ici seulement pour une note invalide (DevTools ouvertes)
          return false;
        }
        return true;
      }
    2. Bonnes pratiques de débogage

      1. Reproduire le bug de façon fiable (quelles actions, quelles données).
      2. Formuler une hypothèse (« la note est une chaîne »).
      3. Poser un point d'arrêt juste avant l'endroit suspect et vérifier l'hypothèse en observant les valeurs.
      4. Corriger, puis retester le cas qui posait problème… et les autres.
      5. Nettoyer: retirer les debugger, les console.log temporaires et les points d'arrêt inutiles (clic droit dans le panneau Breakpoints → Supprimer tous les points d'arrêt).
      6. Commiter la correction avec un message clair : git commit -m "Correction : conversion des notes en nombres".
    3. Activités

    4. Activité 1 : le bug de la moyenne

    • Reproduisez l'exemple de la leçon. Notez la valeur de total à chaque tour de boucle grâce au panneau Scope, puis la moyenne exacte affichée avant correction.
    • Ajoutez l'expression typeof n dans Watch. Corrigez le bug et vérifiez le résultat.

    Activité 2 : point d'arrêt conditionnel

    • Écrivez une boucle de 1 à 500 qui additionne les nombres. Posez un point d'arrêt conditionnel qui ne s'arrête que lorsque i === 250. Relevez la valeur de la somme à ce moment.

    Activité 3 : F10, F11 ou Maj + F11 ?

    • Posez un point d'arrêt sur la ligne afficher();. Avec F11, entrez dans afficher, puis dans calculerMoyenne. Observez la Call Stack à chaque étape. Ressortez avec Maj + F11.

    Activité 4 : qui modifie mon titre ?

    • Ajoutez à une page un script qui change le texte d'un <h1> trois secondes après le chargement (setTimeout). Avec un point d'arrêt sur le DOM (modification de sous-arbre), trouvez la ligne responsable sans ouvrir le fichier.
    • Déposez vos fichiers et une capture d'écran de chaque activité dans le dépôt GitHub js-debogage.
    Corrigés. Activité 1 : total vaut "014", "01415", "014159"; avant correction, la page affiche 4719.67 (14159 / 3) ; typeof n vaut "string". Activité 2 : à i === 250, avant l'addition de 250, la somme vaut 31125 (1 + 2 + … + 249).
  • À retenir

    • Un point d'arrêt met le code en pause pour observer les valeurs réelles, sans modifier le code.
    • F8 reprendre, F10 ligne suivante, F11 entrer dans la fonction, Maj + F11 en sortir.
    • Scope, Watch et Call Stack montrent l'état du programme pendant la pause.
    • Points d'arrêt conditionnels, logpoints, debugger, événements et DOM permettent de cibler précisément le problème.

    Sources : MDN Web Docs (developer.mozilla.org), documentation de Visual Studio Code et des Chrome DevTools.