Les bases du débug
-
Sommaire
Introduction
Quand on rencontre des problèmes, la phase de débug commence. Mais cette partie là n’est pas dans les tutoriels… ça change aujourd’hui !
Bienvenue dans le tutoriel sur les bases du débug !Nous allons ici apprendre à résoudre des problèmes communs, et surtout, à savoir utiliser les outils que Eclipse met à notre disposition (Les autres IDE aussi, mais je ne les utilise pas et ne connais donc pas leur fonctionnement).
Le debug avec des print
Pour la première partie, nous allons utiliser ce bout de code :
System.out.println("Texte");
Cette ligne est un des outils les plus communs pour vérifier le fonctionnement de son programme, elle permet d’afficher les données que l’on souhaite vérifier ainsi que d’afficher un message lors de l’exécution du programme.
Premier exemple :
@SubscribeEvent public void onOpenChatGui(GuiOpenEvent event) { if(event.getGui() instanceof GuiChat) { GuiChat chat = (GuiChat)event.getGui(); ObfuscationReflectionHelper.setPrivateValue(GuiChat.class, chat, AccMod.instance.chatPrefix, "defaultInputFieldText", "field_146409_v"); } }
Ici, je veux ouvrir un menu et ajouter du texte (Le code n’est pas important, c’est un exemple) mais quand j’ouvre un menu rien ne se produit ! Je pense que mon code est juste, mais alors pourquoi est-ce que ça ne fonctionne pas ?
La première étape ici est de vérifier si le code est appelé! Car même si notre code est juste, si on ne l’appelle jamais, il ne sera pas utilisé.
Pour faire ceci, j’ajoute donc dans ma méthode la ligneSystem.out.println("Je suis dans onOpenChatGui");
Une fois le jeu lancé, quand j’ouvre un menu, rien dans la console! Donc mon code n’est pas appelé. Il faut ensuite chercher les causes possibles :
- L’event ne fonctionne pas et forge est cassé
- Mon code est mauvais
- J’ai oublié d’enregistrer l’event
Une de ces trois causes semble plus probable que les autres :
Forge est bien évidemment casséJ’ai oublié d’enregistrer l’event et donc ma fonction n’est jamais appelée.
Comme par magie, j’ai tout d’un coup réparé mon problème !Le print peut aussi être utilisé pour vérifier qu’une variable a la bonne valeur :
System.out.println(maValeur);
Ici, énormément de choses sont possible, et je ne peux pas toutes les lister. Sachez juste que si votre code ne se comporte pas comme prévu, vous pouvez toujours rajouter des print et faire afficher ce que vous voulez vérifier en console.
Les prints peuvent être utilisés pour vérifier le code lors d’une exécution, mais un autre outil existe pour simplifier le processus de débuggage :
L’utilisation du debugger sous Eclipse
Le debugger est un outil très puissant. Avec celui-ci, vous pouvez arrêter le temps pour votre application et **voir **ce qui ne va pas.
Pour reprendre l’exemple précédent, si je veux vérifier que ma méthode s’exécute, je peux également utiliser le debugger.
La première étape pour l’utiliser est de placer un “Break point”, un point d’arrêt. Pour se faire, trouvez la ligne qui vous pose problème et double-cliquez dans la partie bleutée :
Ce point d’arrêt va se déclencher dès que l’application (dans notre cas, Minecraft) va exécuter le code présent sur la ligne.
Pour lancer en mode debug, cliquez sur l’icône d’insecte : ou appuyez sur F11Ainsi, en lançant le jeu, je peux également voir que le code n’est jamais appelé, tout comme avec le print. Mais l’avantage du “debugger” n’est pas uniquement de voir si le code s’exécute, il permet d’avoir accès à toutes les variables à l’instant où le jeu est arrêté - ainsi que de pouvoir modifier le code sans relancer le jeu!
L’accès au variables :Quand votre code arrive sur un point d’arrêt, vous devriez voir ce message :
Celui-ci ouvre la perspective de debug:
Je vais donc montrer les deux onglets principaux
Le call-stack :
Ici on peut voir la liste des méthodes et fonctions qui ont été appelé avant celle sur laquelle on s’arrête. On part donc du main (et même avant dans la JVM) puis on remonte jusqu’à notre event.
Ceci peut être utile pour être sûr que notre code est appelé de l’endroit où l’on souhaite et non d’un autre.L’espion / les variables :
Ici on retrouve toutes les variables présentes dans la méthode en cours d’exécution. Les objets peuvent donc être dépliés et on voit touts leurs attributs. Très utile pour être sûr que les variables que l’on passe à notre méthode soient celles attendues.
Par exemple ici on peut voir que l’objet “gui” sous l’objet “event” est null. Ceci pourrait être une cause de problèmes et on peut très vite la repérer.
Modifier le code en temps réel :
Une des fonctions les plus intéressantes du mode debug est bien sûr la possibilité de modifier du code en temps réel.
Les seuls limites ici sont sur les déclarations de nouvelles méthodes/attributs ainsi que la suppression de ceux-ci.Pour mieux expliquer, voici quelques tâches :
- Tester la puissance d’une explosion et l’ajuster
- Modifier l’angle d’une partie d’un modèle
- Ajouter un nouvel item/block
- Ajouter de nouvelles méthodes a mon objet
Ici, les deux premiers sont possibles en mode debug car ils ne modifient pas la déclaration de notre classe, seulement sa logique. Ajouter un nouvel item ou block n’est pas possible car les méthodes de register ne sont appelées qu’au lancement. Il n’y aurait aucun changement si le code n’est pas appelé après nos modifications.
En règle générale, les méthodes d’update (ex: Entity#update()) et de render sont de très bonne cibles pour le mode debug car le code est exécuté en permanence et toute modification se verra instantanément.
Crédits
Rédaction :
- Gugu
Correction :
- Toutoune1008
Ce tutoriel de Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International