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 ligne

    System.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 F11

    Ainsi, 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

    Creative Commons
    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

    retourRetour vers le sommaire des tutoriels