• Aucun résultat trouvé

Inspecteurs spécialisés pour les Fair Threads

Any Scheduler Event suspend l’exécution lors de la survenue de l’un des événements précédents.

Tracer les événements survenant dans l’ordonnanceur

L’extension de débogage pour les Fair Threads permet d’enregistrer les événements se produisant dans l’ordonnanceur comme les changements de contexte, les diffusion de signaux ou les fins d’instants. L’utilité d’enregistrer ces événements est double. Tout d’abord cela permet d’améliorer les informations de débogage fournies à l’utilisateur. Par exemple, lors de l’inspection de l’ordonnanceur, le débogueur peut afficher le thread responsable de la diffusion d’un signal, ainsi que sa position dans le code source. De plus, la trace permet de « surveiller » l’exécution d’une partie du programme afin d’obtenir une vision détaillée de ce qui s’est produit dans l’ordonnanceur durant plusieurs instants.

Dans la boîte à outils, deux options permettent de contrôler l’enregistrement des évé- nements :

Enhanced Inspection cette option active l’enregistrement des événements se produisant dans l’ordonnanceur. Quand l’utilisateur effectue un exécution pas-à-pas, il obtient

automatiquement des informations de débogage étendues3. Cette inspection étendue

est automatiquement débrayée lorsque l’exécution est résumée. De plus, les événe- ments enregistrés sont effacés à chaque changement d’instant ;

Record Scheduler State avec cette option, l’enregistrement des événements reste activée tout au long de l’exécution et entre les instants. Plus tard, la trace produite peut être visualisée ou effacée avec les boutons correspondants dans la boîte à outils (cf.

figure8.3).

Liste des threads

La dernière partie de la boîte à outil présente la liste des fair threads vivants dans le programme. Elle masque les threads JVM standard. Les threads sont présentés sous forme d’arbre dont les nœuds représentent des ordonnanceurs et les feuilles des threads. Il peut y avoir plusieurs ordonnanceurs dans le programme et ces derniers peuvent être emboîtés puisque ce ne sont eux aussi des threads.

La figure 8.3 montre les threads du programme d’exemple. Ils sont identifiés par leur

nom et un numéro unique pour les référencer depuis la ligne de commande de Bugloo. Un double-clic sur un thread permet de lancer un inspecteur graphique. Les différents inspec- teurs sont décrit dans la section suivante.

8.5 Inspecteurs spécialisés pour les Fair Threads

Cette section présente les nouvelles vues développées pour l’inspecteur structurel afin d’améliorer le débogage des Fair Threads. Ces vues servent à inspecter l’état courant de l’ordonnanceur et des threads qu’il contrôle. La suite de la sections décrit les deux vues développées pour l’ordonnanceur, la vue des threads et celle des signaux.

3

Si l’option est activée au milieu d’un instant, elle ne sera pleinement effective qu’au début de l’instant suivant.

CHAPITRE 8. ÉTENDRE BUGLOO : LE DÉBOGAGE DES FAIR THREADS

(a) L’inspecteur d’ordonnanceur (b) L’inspecteur d’ordonnanceur en deux dimen- sions

(c) L’inspecteur de thread (d) L’inspecteur de signal

Fig. 8.4: Nouvelles vues pour l’inspecteur structurel 8.5.1 Vues pour l’ordonnanceur

Présentation détaillée

La capture d’écran de la figure 8.4(a) détaille l’état de l’ordonnanceur lorsque le pro-

gramme de la figure8.2est suspendu à la ligne 15. La vue est décomposée en quatre parties.

La première partie présente des informations sur l’ordonnanceur : son nom, l’instant courant et, le cas échéant, l’ordonnanceur auquel il est rattaché.

La seconde partie est une table listant les threads attachés à cet ordonnanceur. Les informations concernant un thread incluent son nom et son état courant. Contrairement

8.5. INSPECTEURS SPÉCIALISÉS POUR LES FAIR THREADS aux threads POSIX, un fair thread peut prendre six différents états :

running le thread est le celui en cours d’exécution dans l’ordonnanceur ; standby le thread peut être exécuté dans l’instant ;

await le thread est en attente de signal ;

end of instant le thread a terminé son exécution pour l’instant courant ; terminated le thread a terminé toute son exéction ;

unattached le thread n’a pas encore démarré car il n’a pas été attaché à un ordonnanceur.

Cet état n’est visible que dans la vue d’un thread (cf. section 8.5.2.)

Un double-clic sur une ligne commande à l’inspecteur d’empiler une nouvelle vue d’ins- pection pour le thread sélectionné.

Enfin, les deux dernières parties de cette vue sont dédiées aux signaux :

– une première table contient la liste des signaux diffusés dans l’ordonnanceur durant l’instant. Chaque ligne contient le nom d’un signal et sa valeur associée (ou le symbole

[...]si le signal a été diffusé plusieurs fois). Un double-clic empile une nouvelle vue

pour le signal selectionné ;

– une deuxième table contient la liste des signaux attendus par les threads et qui n’ont pas encore été diffusés dans l’instant. Dès qu’un de ces signaux est diffusé, la ligne correspondante se déplace vers la table précédente.

Présentation graphique en deux dimensions

Le contenu d’un ordonnanceur peut aussi être représenté de manière purement gra-

phique, en deux dimensions. La figure8.4(b) donne un aperçu du rendu effectué dans cette

vue. L’affichage s’inspire du débogueur Haskell CHD [CH04] et donne une vision plus syn- thétique que la vue précédente. Cette vue est décomposée en deux colonnes verticales : la colonne de gauche représente les threads contrôlés par l’ordonnanceur et la colonne de droite les signaux émis durant l’instant. La forme et la couleur des objets varient selon leur état. Un disque gris dans la colonne de gauche indique qu’un thread a terminé son exécution pour l’instant. Un disque noir encadré indique que le thread est en cours d’exécution. De même, un cercle en pointillé dans la colonne de droite indique qu’un signal est attendu par un ou plusieurs threads. Un cercle noir indique qu’il a déjà été diffusé dans l’instant. Enfin, les flèches pointées vers la colonne de droite indiquent quels sont les threads en attente de signaux. Des flèches pointées vers la gauche indiquent le réveil de threads.

8.5.2 Vue pour un thread

La vue spécialisée pour les threads, présentée en figure 8.4(c), produit un affichage

simple. Elle présente tout d’abord le nom du thread et celui de l’ordonnanceur auquel il est attaché. Un clic sur ce dernier empile une nouvelle vue dans l’inspecteur.

La vue permet de connaître l’état courant du thread, parmi les six état décrit précédem- ment. Enfin, si le thread est en attente d’un ou plusieurs signaux, les noms sont inclus dans la liste en bas de la vue.

Dans la capture d’écran de la figure 8.4(c), on voit que le thread A du programme

d’exemple attend le signal sig1. En utilisant plusieurs fenêtres d’inspection, il est possible de visualiser l’état de plusieurs threads en même temps.

CHAPITRE 8. ÉTENDRE BUGLOO : LE DÉBOGAGE DES FAIR THREADS 8.5.3 Vue pour un signal

La vue pour un signal (figure8.4(d)est composée du nom du signal en cours d’inspection

et de deux autres tables. La première table contient la liste des différentes valeurs associées à chaque émission du signal durant l’instant. Si l’option d’inspection étendue est activée, la vue précise, pour chaque signal, le thread et l’endroit dans le code source d’où est partit la diffusion. Enfin, la seconde table liste le nom et l’identificateur de chaque thread en attente du signal en cours d’inspection. Si le signal a déjà été émis au cours de l’instant, cette table est vide.