• Aucun résultat trouvé

double :

– il permet de sauver de manière « rudimentaire » l’état du débogué et la configuration courante du débogueur. L’utilisateur peut ainsi arrêter une session de débogage pour la reprendre ultérieurement. Il peut aussi « rejouer » une session sans avoir à retaper toutes les commandes. Bien sûr, cette fonctionnalité ne fonctionne pas correctement sur des programmes non-déterministes, mais elle reste pratique dans de nombreux cas.

– le chargement d’historique est utilisé comme mécanisme de configuration. Au démar- rage de Bugloo, un historique « système » est évalué pour initialiser le débogueur. Cet historique peut être modifié par les implanteurs de langages afin d’initialiser les fonctionnalités de débogage propres à leur langage. Cela leur permet par exemple de créer des points d’arrêt par défaut à chaque nouvelle session, de rajouter des vues à l’inspecteur graphique ou bien de définir des filtres fournissant une vue virtuelle de

la pile d’exécution (cf. chapitre4).

La ligne de commande Bugloo évalue continuellement des expressions Scheme. L’exé- cution d’une commande Bugloo s’apparente à un appel de fonction classique, mais dans

lequel les arguments ne sont pas évalués1. Par exemple, la commande suivante pose un point

d’arrêt dans la fonction fun de la classe foo :

(bugloo) (bp add foo fun)

Les arguments sont passés à la commande bp sous leur forme symbolique. L’utilisateur peut forcer la ligne de commande à évaluer des arguments en utilisant la forme unquote de Scheme :

(bugloo) (bp add foo ,(+ 10 20))

La commande précédente pose ainsi un point d’arrêt dans la classe foo à la ligne 30.

3.3 Instrumentation du flot de contrôle

Comme tous les débogueurs, Bugloo permet de poser des points d’arrêt dans différents points logiques de l’exécution du programme débogué afin de suspendre son exécution :

– sur passage à un endroit donné dans le code source ; – sur lecture ou écriture d’un champs d’un objet structuré ; – sur le déclenchement d’une exception ;

– sur l’entrée ou le retour d’une fonction.

Contrairement aux autres débogueurs, il n’existe pas dans Bugloo de type particulier pour représenter des variantes des points d’arrêts précédents, comme par exemple les points d’arrêt temporaires ou conditionnels. Pour le débogueur, ces variantes sont considérées comme des attributs.

Dans Bugloo, les attributs sont des fonctions prenant un point d’arrêt en paramètre et retournant un booléen. Ils peuvent être associés à n’importe quel type de point d’arrêt précédemment évoqué. Dans le débogueur, ils sont représentés par des mot-clés Scheme, suivis par leurs arguments éventuels :

(bugloo) (bp add foo bar :ttl 1 :footprint)

1

le choix a été fait de ne pas évaluer les arguments des commandes Bugloo afin de faciliter l’utilisation de la ligne de commande.

CHAPITRE 3. LE DÉBOGUEUR BUGLOO

Le point d’arrêt précédent est posé dans la classe foo au début de la fonction bar. Lorsqu’un point d’arrêt est atteint, tous ses attributs sont exécutés en séquence. Si l’un des attributs renvoie la valeur faux, l’action de suspension du point d’arrêt est invalidée et l’exécution du programme reprend. Différents attributs sont disponible par défaut dans le débogueur :

ttl la durée de vie d’un point d’arrêt. À chaque passage sur le point d’arrêt, sa durée est dé- crémentée. Lorsqu’elle atteint zéro, l’attribut commande au débogueur de supprimer le point d’arrêt et renvoie la valeur faux pour reprendre l’exécution.

footprint cet attribut permet d’afficher un message à chaque fois qu’un point d’arrêt est atteint avant de reprendre aussitôt l’exécution. C’est un moyen de tracer l’exécution sans avoir à insérer de print et recompiler le programme.

thread cet attribut active le point d’arrêt seulement si le thread qui a déclenché la suspen- sion correspond à l’argument associé à l’attribut.

trace cet attribut enregistre le nom de la fonction se trouvant en sommet de pile avant de relancer l’exécution. Il peut être utilisé avec des points d’arrêt sur entrée de fonction pour obtenir la liste des fonctions appelées dans une partie particulière du programme. Ce type de trace est lent mais néanmoins utile dans certains cas.

emacs cet attribut est utilisé lorsque le débogueur est démarré depuis Emacs. Lorsqu’un point d’arrêt est atteint, l’attribut envoie un code spécial sur la sortie standard pour forcer l’éditeur à actualiser ses fenêtres de code source. Comme cet attribut a une vocation uniquement informative, il renvoie toujours vrai.

L’attribut custom est un attribut générique qui permet d’exécuter une fonction per- sonnelle, dans le but de modéliser des comportements supplémentaires. Par exemple, il est possible de rendre effectif un point d’arrêt après un certain nombre de passages de la manière suivante :

(bugloo) (bp add foo bar

:custom ,(let ((n 10)) (lambda ()

(or (<= 0 n) (begin (set! n (- n 1)) #f) )))) Les implanteurs de langages peuvent créer leur propres attributs additionnels à l’aide de l’API de programmation de Bugloo. Ce type d’approche est beaucoup plus efficace que celle employée dans les débogueurs traditionnels car elle est extensible et elle est applicable à n’importe quel type de point d’arrêt. De plus, elle multiplie les types de points d’arrêt que peut construire l’utilisateur, plutôt que de le limiter à un nombre prédéfini de combinaisons, comme cela est le cas dans les débogueurs traditionnels.

Hormis le mécanisme de sauvegarde d’historique, le débogueur ne prévoit pas de moyen direct de sauver la liste des points d’arrêt présents dans le débogueur pour les réutiliser dans une session ultérieure. Toutefois, l’utilisateur peut définir sa propre fonction. Cette fonction peut utiliser l’API de programmation de Bugloo pour retrouver la liste des points d’arrêt et en sauver une représentation sur disque. Dans ce cas, c’est à lui de s’assurer de la validité des valeurs sauvées. En particulier, la fonction associée à l’attribut custom ne peut pas être sauvegardée car, lors de l’appel à la commande bp, la forme symbolique de cette fonction n’est pas conservée et ne peux donc plus être recréée.