Améliorer le Débogage 'printf'

Autres langues : English Español Deutsch 日本語 한국어 Português 中文

L’une des techniques de débogage les plus courantes, le débogage ‘printf’ est particulièrement populaire car la plupart des gens l’apprennent intuitivement lors de l’écriture de leurs premiers programmes.

Le débogage ‘printf’ est très accessible car vous n’avez besoin d’aucun outil spécial. Lorsque vous faites face à vos premiers bugs, même avant de savoir ce qu’est un débogueur, il vient naturellement à l’esprit de faire afficher les variables par votre programme étape par étape, afin de suivre l’exécution dans la console.

Bien que ce soit l’une des techniques de débogage les plus basiques, les développeurs expérimentés l’utilisent également beaucoup. Elle peut vous aider à investiguer tout type de problème, comme des routines sous-optimales, un état incohérent, des problèmes de multithreading, et plus encore.

Comme je l’ai déjà mentionné, cette technique ne nécessite pas d’outils spéciaux, comme un IDE. Cependant, si vous en utilisez un, il peut vous rendre encore plus efficace dans la journalisation de l’état du programme.

Info icon

Cet article présente des fonctionnalités d’IntelliJ IDEA. Des fonctionnalités similaires peuvent ou non être disponibles dans d’autres IDE. Si vous utilisez un outil différent, pensez à consulter sa documentation pour voir si ces fonctionnalités y sont également présentes.

Live templates

IntelliJ IDEA fournit des live templates pour les modèles de journalisation de débogage les plus courants. Pour utiliser un live template pour la journalisation de débogage, entrez l’abréviation correspondante et appuyez sur Tab. IntelliJ IDEA générera l’instruction d’impression et l’insérera à l’emplacement du curseur.

Voyons quelques exemples.

Journaliser les paramètres de méthode


public static BufferedImage recolor(BufferedImage in, BufferedImage mask, int newColor) {

    // type 'soutp' here, then press Tab

    return null;
}
public static BufferedImage recolor(BufferedImage in, BufferedImage mask, int newColor) {

    System.out.println("in = " + in + ", mask = " + mask + ", newColor = " + newColor);

    return null;
}

Journaliser les valeurs


public static double coolMethod(double parameter) {
    double a = Math.random();
    double b = Math.random();

    // type 'soutv' here, press Tab, then select the value

    return a * b * parameter;
}
public static double coolMethod(double parameter) {
    double a = Math.random();
    double b = Math.random();

    System.out.println("b = " + b);

    return a * b * parameter;
}

Journaliser les entrées de méthode


public static BufferedImage recolor(BufferedImage in, BufferedImage mask, int newColor) {

    // type 'soutm' here, then press Tab

    return null;
}
public static BufferedImage recolor(BufferedImage in, BufferedImage mask, int newColor) {

    System.out.println("ImageUtils.recolor");

    return null;
}

Points d’arrêt de journalisation

L’un des inconvénients du débogage avec des instructions d’impression est qu’elles introduisent la charge de gestion manuelle. Vous ne pouvez pas les activer et les désactiver rapidement, et vous ne voulez certainement pas les commiter accidentellement et les exécuter en production.

Pour cette raison, si vous avez besoin de journaliser quelque chose à des fins de débogage, je recommande d’utiliser des points d’arrêt de journalisation, car ils sont beaucoup plus faciles à gérer.

Point de journalisation affiché comme un cercle jaune dans la marge de l'éditeur Point de journalisation affiché comme un cercle jaune dans la marge de l'éditeur

Pour définir un point d’arrêt de journalisation, maintenez Shift enfoncé, puis cliquez dans la marge. Contrairement à un point d’arrêt régulier, il ne suspend pas l’exécution du programme, mais affiche dans la console à la place.

Par défaut, c’est un message indiquant que le programme a atteint cette ligne. Vous pouvez également utiliser les options près de la case à cocher Evaluate and log dans les paramètres du point d’arrêt si vous préférez journaliser la trace de pile actuelle ou le résultat d’une expression personnalisée.

Boîte de dialogue des paramètres du point d'arrêt avec une expression personnalisée dans le champ « Évaluer et enregistrer », et la case à cocher « Suspendre » décochée Boîte de dialogue des paramètres du point d'arrêt avec une expression personnalisée dans le champ « Évaluer et enregistrer », et la case à cocher « Suspendre » décochée
Info icon

Soyez prudent avec les expressions de journalisation. Évaluer celles qui causent des effets secondaires peut être une source de nouveaux bugs ou de comportements inattendus. De plus, lorsqu’elles sont utilisées dans du code chaud, elles peuvent ralentir considérablement votre programme.

Lorsque les points d’arrêt de journalisation deviennent nombreux, vous pouvez les suivre et les gérer dans la boîte de dialogue Breakpoints (Run | View Breakpoints) :

La boîte de dialogue 'Breakpoints' affiche tous les points d'arrêt du projet regroupés par type La boîte de dialogue 'Breakpoints' affiche tous les points d'arrêt du projet regroupés par type

Vous pouvez même créer des groupes personnalisés pour eux :

Un clic droit sur un point d'arrêt dans la boîte de dialogue 'Breakpoints' affiche un menu contextuel avec l'option 'Déplacer vers le groupe' Un clic droit sur un point d'arrêt dans la boîte de dialogue 'Breakpoints' affiche un menu contextuel avec l'option 'Déplacer vers le groupe'

Cela vous aidera à gérer vos points d’arrêt de manière centralisée. Par exemple, vous pouvez créer un groupe lié à un bug particulier et le sauvegarder pour plus tard. Lorsque le problème disparaît, il suffit de le désactiver. De cette façon, si le problème réapparaît, vous n’avez pas à tout recréer depuis le début. Il suffit de réactiver le groupe.

Journalisation des événements fréquents

Pour les événements qui se produisent souvent pendant l’exécution du programme, journaliser chaque événement individuel peut être superflu. Non seulement cela inonde la console de messages, mais une grande quantité d’interactions avec les I/O peut ralentir considérablement la session de débogage.

Console avec de nombreux messages similaires, tels que 'Mouse moved to 380, 183' Console avec de nombreux messages similaires, tels que 'Mouse moved to 380, 183'

Pour de tels événements, il peut être utile d’utiliser la fonctionnalité Pass count. Vous pouvez y accéder dans la boîte de dialogue Breakpoints.

Boîte de dialogue des paramètres du point d'arrêt avec le champ 'Pass count' défini sur 100 Boîte de dialogue des paramètres du point d'arrêt avec le champ 'Pass count' défini sur 100

Après avoir défini Pass count sur une valeur spécifique, le point d’arrêt correspondant ne se déclenchera qu’à chaque n-ième passage, garantissant que la journalisation ne devienne pas une nuisance.

Résumé

Que vous insériez des instructions d’impression ou que vous définissiez des points d’arrêt de journalisation pour le débogage, les outils modernes ont des fonctionnalités pour améliorer votre expérience de débogage. Avec cet article, je voulais m’assurer que vous connaissiez ces petites astuces qui rendent l’ensemble du processus plus agréable.

Bon débogage !

all posts ->