Matlab intègre un debugger — j’emploie sciemment le terme anglais car je trouve le mot « bogue » ainsi que ses dérivés particulièrement ridicules — utilisable facilement depuis l’interface graphique. Nous allons aborder dans cet article son utilisation en ligne de commande et dans le code.
Généralités
L’emploi du debugger est somme toute très classique, et une poignée de commandes spécifiques suffisent à travailler de façon efficace. Les commandes du debugger commencent généralement par « db ». Lorsque l’exécution est suspendue par un point d’arrêt, le prompt change et devient « K>> ». Toutes les commandes Matlab habituelles peuvent alors être invoquées. On peut notamment vérifier le contenu des variables, lister les variables (« who » ou, mieux, « whos »), visionner le contenu du M-file (« dbtype »), etc. La chose la plus importante est de bien comprendre la notion d’« espace de travail », ou workspace. Lorsque l’exécution s’arrête au milieu d’une fonction, le workspace est celui de la fonction en question, et donc seules les variables de cette fonction sont visibles. Au lancement de Matlab, le workspace est celui par défaut, hiérarchiquement au-dessus de tous les autres, et est appelé base workspace. Il est possible de changer de workspace, comme nous le verrons plus loin.
Points d’arrêt
Pour placer un point d’arrêt, il suffit d’insérer dans le code de la fonction la commande « keyboard ». Arrivé à cette ligne, l’interpréteur s’arrêtera et donnera la main à l’utilisateur, avec le prompt « K>> ». Il est également possible de définir des points d’arrêt « dynamiques », c’est-à-dire créés automatiquement dans certains contextes, avec la commande « dbstop ». Elle peut être lancée depuis le base workspace ou à l’intérieur d’une fonction. Quelques contextes d’utilisation sont explicités ci-dessous :
- dbstop if error place un point d’arrêt à l’endroit où la première erreur est détectée par l’interpréteur ;
- dbstop if warning fait pareil, pour une alerte ;
- dbstop if naninf arrête l’exécution lorsqu’une valeur infinie est générée, typiquement dans le cas d’une division par zéro ;
- dbstop in (mfile) at (linenumber) stoppe l’exécution lorsque l’exécution arrive à la ligne linenumber du fichier mfile ;
- dbstop in (mfile) at (subfunction) suspend l’exécution à l’entrée de la sous-fonction subfunction du fichier mfile.
Pour retirer les points d’arrêt dynamique, il suffit d’utiliser la même commande, en remplaçant « dbstop » par « dbclear ». Enfin, il est possible de visualiser l’ensemble des points d’arrêt à l’aide de « dbstatus ».
Poursuite et fin de l’exécution
Pour reprendre l’exécution après un point d’arrêt à partir du prompt, on peut soit utiliser l’instruction « dbcont », soit utiliser « return » — comme pour les fins de sous-fonctions. Pour une exécution en mode pas à pas, c’est-à-dire instruction par instruction depuis le point d’arrêt, la commande à utiliser est « dbstep ». Matlab affiche alors le contenu de l’instruction en cours. Enfin, la commande « dbquit » permet de quitter le mode debugger et de mettre fin à l’exécution. Attention à ne pas employer « quit » ou « exit », qui, en plus, fermeraient Matlab !
Changement de workspace
Lors du debug, il est souvent nécessaire de connaître les valeurs des variables ou de tester des commandes à la fois dans une sous-fonction et dans la fonction appelante. Pour celà, il faut changer de workspace, car le debugger se place celui de la fonction exécutée au moment du point d’arrêt. Les workspaces suivent la même hiérarchie parent-enfant que les fonctions appelantes par rapport aux fonctions appelées. Ainsi, si la fonction A appelle la fonction B et que le point d’arrêt est dans la fonction B, il faut monter d’un niveau pour se placer dans le workspace de la fonction A. Pour accéder au base workspace, il faut à nouveau monter d’un niveau car toutes les fonctions sont appelées au niveau du base workspace. La commande pour monter d’un niveau est « dbup », celle pour descendre « dbdown ».
Exemple :