TD3
- Tristan Coignion
- Anthony Hanson
Conception du projet
Le projet est lancé à partir de la classe Debugger, qui va utiliser la CliCommander qui utilisera des commandes.
Le debugee est MyMain.
Remarques sur certaines commandes
Sur les breakpoints
break
break utilise simplement l'API jdi pour créer une breakpoint request à un endroit spécifique. Si la ligne ou la classe n'existe pas, l'utilisateur est prévenu
breakOnce
et breakOnCount
Pour ceux là, on a réutilisé le code de break
par héritage et on modifié le code de break
pour qu'il prenne en paramètre le nombre de passages du breakpoint (break
fait -1 passages, pour dire qu'il ne s'enlève jamais).
Mais jdi
ne supporte pas le nombre de passage sur les breakpoints. On a créé des BreakpointReference
stockés dans une liste statique du Debugger
. Ainsi lorsqu'on retombe sur le breakpoint dans le debugger, on regarde dans la liste combien de passages il lui reste, et s'il ne lui en reste plus, on le supprime de la liste.
breakBeforeMethodCall
Ce breakpoint-ci utilise les MethodEntryRequest
de jdi
et aussi notre propre liste de références. La méthode entry request ne peut filtrer que jusque dans une classe. Cela signifie qu'un break est déclenché pour toutes les entrées de méthodes de la classe.
En rajoutant notre propre liste de références, nous pouvons filtrer à la main les break requests qui ne sont pas en rapport avec la bonne méthode.
Notons d'ailleurs que le polymorphisme n'est pas vraiment prit en compte ici. C'est à dire que si on fait un break pour une méthode, il fonctionnera pour toutes les méthodes du même nom dans la même classe.
Commandes d'impression de variables
arguments
printVar
temporaries
receiverVariables
Ces commandes fonctionnent toutes de la même manière, avec des variations entre elles : On récupère la liste des références des variables (Field
LocalVariable
) depuis la frame, ou depuis la définition de la méthode/classe, puis on récupère leur valeur dynamiquement depuis la frame ou l'objet.
Dans le cas de receiverVariables
, on doit faire attention à faire la différence entre les champs statiques ou non, car on ne récupère pas leurs valeurs de la même manière.
Commandes d'impression de contexte
method
receiver
sender
stack
frame
Ces méthodes manipulent simplement la frame, et les locations pour donner des informations à l'utilisateur sur où il se trouve
Autres commandes
continue
Cette commande ne fait absolument rien.
Commandes non implémentées
stackTop
Nous aurions pu implémenter cette commande, mais ça aurait signifié devoir tracker chaque return et chaque valeur renvoyée par un return, de manière récursive. Et ça aurait été ridiculeusement difficile. De plus jdi
ne semble pas apporter de manière simple de faire cela non plus.
Exemple d'execution
Comment utiliser le projet
Faire mvn clean package
puis java -jar ./target/TD3-1.0.jar