Bien gérer l’activation de points d’arrêt avec IntelliJ

Le debugging est une tâche fastidieuse bien connue des développeurs. Les IDE proposent en général de nombreuses options concernant l'utilisation des breakpoints. Les maîtriser, c'est se faciliter la vie ! Claire nous présente les différentes options possibles avec IntelliJ.

Le travail de debuging est une tâche habituelle pour tout développeur. Mal outillé, cela peut rapidement se transformer en cauchemar. Heureusement, les IDE ont depuis longtemps mis à la disposition des développeurs une palette d’outils dédiée à nous faciliter la tâche.

Les points d’arrêt ont été parmi les premiers outils à entrer dans cette catégorie. Depuis, ils ont énormément évolué et proposent (en fonction des IDE) de nombreuses options.

IntelliJ, en tant qu’IDE mature, est particulièrement riche de ce point de vue, en fait si riche qu’il est parfois un peu difficile de s’y retrouver si on ne connait pas ! Dans cet article, je vais vous présenter quelques-unes des fonctionnalités que j’utilise et qui me paraissent essentielles tant elles m’ont permis de réduire le temps que je passe à tracker les bug.

 

Activer un point d’arrêt par une condition simple

Avec IntelliJ, vous avez la possibilité d’activer un point d’arrêt en ne remplissant qu’une seule condition. Vous pouvez alors utiliser n’importe quelle variable ou fonction définie dans le scope dans lequel le breakpoint est posé.

Définir une variable dans IntelliJ

Prenons l’exemple de la fonction « fizzbuzz » dans laquelle vous souhaitez vous arrêter uniquement si la variable i est égal à 2 :

Pour y parvenir, vous devez créer un breakpoint conditionnel selon deux méthodes possibles :

  1. 1re option : via un clic droit sur un point d’arrêt existant en lui ajoutant une condition : 
  2. 2e option : via le panneau de contrôle des breakpoints (Ctrl + Shift + F8) dans lequel vous pouvez éditer le champ « Condition » dans les détails du breakpoint.

Ajouter une condition via le panneau de contrôle des points d’arrêts

En lançant le programme en débug, on constate alors que l’on s’arrête bien lorsque i est égal à 2 :

Activer un point d’arrêt sans IntelliJ

Il est possible d’effectuer cette manipulation sans utiliser les fonctionnalités d’IntelliJ. Un processus supplémentaire, plus long et plus complexe, qui implique de :

  1. Écrire la condition d’arrêt directement dans le code
  2. Écrire une instruction fictive à l’intérieur
  3. Placer un breakpoint sur cette instruction afin que le débugger s’arrête à l’intérieur

Dans ce cas, attention de ne pas oublier de supprimer le tout une fois le débug fini ! Un processus beaucoup moins pratique mais surtout beaucoup plus risqué d’un point de vue méthodologie.

 

Éviter les premiers arrêts

Autre fonctionnalité intégrée à IntelliJ : l’EDI vous permet de choisir d’activer le point d’arrêt lorsqu’il est atteint pour la « énième » fois via l’attribut « Pass count » accessible depuis le menu des breakpoints.

Plutôt que de poser une condition sur une variable du code, il est possible de l’insérer sur le nombre de fois où le point d’arrêt a été atteint. Une option très utile si vous souhaitez, par exemple, éviter les 4 premières fois où le breakpoint a été atteint et ne vous arrêter qu’à partir de la 5e.

Dans ce cas précis, l’application s’arrêtera au même moment que dans le cas d’une condition d’arrêt posée lorsque i est égal à 4. 

 

Activer un point d’arrêt après un événement donné

Vous pouvez également décider d’activer le breakpoint d’une fonction spécifique uniquement une fois que le breakpoint d’une action précise a été atteint. Il peut en effet s’avérer pratique d’enchaîner les breakpoints dans le cas où vous seriez intéressé par une fonction F qui serait appelée très souvent dans le programme mais uniquement après qu’une certaine action A se soit déroulée. Dans ce cas-ci, la manipulation consiste donc à rendre le breakpoint de cette fonction F actif seulement une fois que le breakpoint de l’action A a été atteint.

Si le premier breakpoint n’est là que pour servir de condition à un autre, il est alors possible de désactiver son attribut « Suspend ». De cette façon, il ne bloquera pas le programme mais servira toujours de point de déclenchement au breakpoint à inspecter.

Comment procéder

Vous souhaitez que le programme s’arrête dans la fonction fizzbuzz à la ligne 12 mais seulement après le print de « Second call » (ligne 7) ? Voici les étapes à suivre :

  1. Créez un breakpoint dans la fonction fizzbuzz
  2. Insérez un breakpoint après le print de « Second call » à la ligne 7
  3. Posez une condition d’activation sur le breakpoint de fizzbuzz pour qu’il devienne actif uniquement lorsque le breakpoint de la ligne 7 aura été atteint

Pour y parvenir, vous devez vous rendre dans le menu des breakpoints et choisir un breakpoint d’activation dans « Disable until breakpoint is hit ».

 

Filtrer par instance d’objet

Cette fonctionnalité vous sera très utile pour suivre un objet précis au milieu de ses nombreux semblables.

Dans le cas du programme suivant, vous souhaitez vous arrêter dans la fonction « bark » uniquement quand elle est appelée par l’objet dog2 :

Pour y parvenir, vous devez : 

  1. Récupérer l’id de dog2 en vous arrêtant en débug plutôt dans le code (ici 491) :
  2. Puis ajouter un filtre sur l’instance 491 de Dog via le menu « Breakpoint ».

Le processus ne s’arrêtera alors uniquement que lorsque la fonction sera appelée sur l’objet 491 (dog2).

 

Filtrer par classe

Enfin, il est également possible d’activer un point d’arrêt uniquement si la classe courante est du type voulu.

Une option qui peut être notamment utile dans une classe abstraite pour que le programme ne s’arrête que si l’objet instancié est d’une certaine classe.

Comment activer le filtrage par classe

Vous souhaitez vous arrêter dans le constructeur de la classe « Animal » uniquement si l’animal en question est un chien.

Pour y parvenir, vous devez :

  1. Créer un breakpoint dans le constructeur d’Animal qui ne sera actif que pour la classe chien.

IntelliJ s’arrêtera alors dans le constructeur de la classe parente uniquement lorsqu’un objet de type Dog est créé.

2. Puis, définir des filtres sur les classes via le champ « Class Filter » du menu breakpoint.

À noter : le bouton « … » permet une grande personnalisation des filtres de classe. 

3. Enfin, ajouter un filtre sur :

  • Une classe précise (ses sous-classes sont, dans ce cas, comprises)
  • Un pattern de nom de classes (une string qui commence ou finit par une étoile *)

Les filtres peuvent également servir à exclure certaines classes (ou pattern de nom de classe).

 

Conclusion

IntelliJ IDEA offre des possibilités d’activation multiples et qui peuvent être combinées facilement. Il est ainsi tout à fait possible d’imaginer un breakpoint actif uniquement sur une certaine classe, après qu’une exception ait été atteinte et seulement si la condition x = y est validée…

Pour plus de précision, vous pouvez consulter la documentation d’IntelliJ IDEA.

Have fun with less debugging!

Laisser un commentaire

MERITIS ICI. ET LÀ.

Carte Meritis

Meritis Finance

5 – 7, rue d’Athènes
75009 Paris

+33 (0) 1 86 95 55 00

contact@meritis.fr

Meritis PACA

Les Algorithmes – Aristote B
2000 Route des Lucioles
06901  Sophia Antipolis Cedex

+33 (0) 4 22 46 31 00

contact@meritis-paca.fr

Europarc de Pichaury – Bâtiment B5
13290 Aix-en-Provence

+33 (0) 4 22 46 31 00

contact@meritis-paca.fr

Meritis Technologies

5 – 7, rue d’Athènes
75009 Paris

contact@meritis-technologies.fr

+33 (0) 1 86 95 55 00


Contactez-nous

Pour connaître et exercer vos droits, concernant l'utilisation des données collectées par ce formulaire, veuillez consulter la page sur notre politique de confidentialité.