Logicielsmoto.com

Nous sommes le 04 Fév 2023, 03:40

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 12 messages ] 
Auteur Message
 Sujet du message: Outil de debug indépendant
MessagePosté: 16 Nov 2022, 23:17 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 419
Localisation: Var
Je vous propose d'échanger ici sur un nouveau concept de debugger indépendant.

L'idée est d'utiliser un socle technique simple pour inspecter la mémoire d'un émulateur lors de son exécution.

Un premier exemple avec DCMOTO :
Fichier(s) joint(s):
WDDebug.png
WDDebug.png [ 45.39 Kio | Vu 728 fois ]


L'exemple affiche :
- quelques variables du personnage principal
- un fenêtre de recherche qui permet de saisir un symbole et de visualiser la valeur correspondante en mémoire en temps réel

En entrée du debugger on passe un fichier .map généré par lwasm à la compilation et qui liste les symboles

Le deuxième effet kisscool ... c'est la simplicité de mise en oeuvre :

Code:
    public void process() {
           
       if (Emulator.pid == 0) {
          ImGui.text("Waiting for process <"+Emulator.processName+">");
          Emulator.pid = OS.getProcessId(Emulator.processName);
          Emulator.process = OS.openProcess(OS.PROCESS_VM_READ|OS.PROCESS_VM_OPERATION, Emulator.pid);
          return;
       }
       
       if (Emulator.process != null) {
          ImGui.text("image_set:"+Emulator.getShort(s, "MainCharacter","image_set"));
          ImGui.text("x_pos:"+Emulator.getShort(s, "MainCharacter","x_pos"));
          ImGui.text("y_pos:"+Emulator.getShort(s, "MainCharacter","y_pos"));
          ImGui.text("x_vel:"+Emulator.getShort(s, "MainCharacter","x_vel"));
          ImGui.text("y_vel:"+Emulator.getShort(s, "MainCharacter","y_vel"));

          if (ImGui.begin("Search", ImGuiWindowFlags.AlwaysAutoResize)) {
              ImGui.inputText("symbol", str, ImGuiInputTextFlags.CallbackResize);
              ImGui.text("value: " + Emulator.getShort(s, str.get()));
          }
       }
       
       ImGui.end();
    }


C'est tout ce qui faut écrire pour implémenter les fenêtres de debug présentées dans la capture d'écran.

Le lancement de l'outil est indépendant de l'émulateur, on peut laisser l'émul tourner, ajouter des infos de debug, recompiler et relancer le debugger et hop il reprend la lecture de la ram.
Ainsi on ne perd pas le contexte de test.

La lib graphique c'est : https://github.com/SpaiR/imgui-java

En quelques heures de travail c'est plutôt sympa d'arriver à ce résultat ! Le plus long a été la mise en place de la lecture de la mémoire d'un processus.
Pour l'instant le processus est récupéré par le titre de la fenetre de l'émulateur, mais je remplacerai ça par une sélection dans une liste.

Je rajouterai également la gestion de teo et probablement theodore dans un avenir proche.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 17 Nov 2022, 10:43 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1769
Localisation: Brest
Suggestion: au lieu d'avoir tout en statique, peut-on faire que le search cherche un symbole et si trouvé l'ajoute dans la liste à afficher dans la boucle principale.

La magie de lire la mémoire d'un autre process est faite par la classe OS que je ne connaissais pas. Google ne semble pas non plus la connaitre. D'où est-ce que ca sort ? Est-ce une surcouche perso aux API windows fournies par SWT ou JNA ?

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 17 Nov 2022, 11:12 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 419
Localisation: Var
Tout est décrit ici :

https://stackoverflow.com/questions/18849609/how-to-manipulate-memory-from-java-with-jna-on-windows

la classe OS est une classe que j'ai créé et qui reprend le contenu de SolitaireHack du tuto ci dessus.

La démo ci-dessus est juste un exemple, effectivement on peut construire quelque chose de plus dynamique avec gestion d'une liste.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 21 Nov 2022, 15:48 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 419
Localisation: Var
Une vidéo qui montre l'avancement :

phpBB [video]


https://youtu.be/AzdKC9fqfzA


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 21 Nov 2022, 16:14 
Hors ligne

Inscription: 06 Juin 2004, 08:23
Messages: 486
C'est super cool, je suis sur que ca va booster le debugging :bien:


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 21 Nov 2022, 18:30 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1769
Localisation: Brest
Ca commence à prendre forme! :bien:

Une suggestion: dans la liste symbole-adresse, si tu mets les adresses (4 lettres) en premier tu aura un bel alignement dans la liste.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 21 Nov 2022, 18:41 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 419
Localisation: Var
c'est fait !
Fichier(s) joint(s):
002.png
002.png [ 15.5 Kio | Vu 651 fois ]


J'ai également aligné la liste filtrée à défaut de pouvoir l'afficher "par dessus" au moins c'est pile en dessous.
Fichier(s) joint(s):
003.png
003.png [ 9.62 Kio | Vu 651 fois ]


(possible en c++ mais pas encore dans la version java)


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 21 Nov 2022, 19:18 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1769
Localisation: Brest
j'ai pas vu dans la vidéo s'il y a moyen d'afficher les watch-points en binaire.

Idée 1: prédéfinir les registres moniteurs (ou les sortir dans les *.map) au format binaire ?

Idée 2: un truc à considérer avec les watch-point comme dans éclipse: passer en rouge une valeur qui est différente de celle du cycle d'affichage précédent. Idem avec la carto mémoire à plat (mais c'est peut-être trop couteux car il y a 512ko à scanner). Par contre le cycle d'affichage étant très rapide visuellement, ca peut flashouiller un max rapidement.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 21 Nov 2022, 20:40 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 419
Localisation: Var
Il n'y a pas encore d'affichage en binaire pour les watches (à venir, bonne idée).
Par contre c'est présent dans l'éditeur hexa quand on clique sur une valeur.

Je vais faire des fenêtres dédiées pour les registres particuliers (moniteur, palette, ...)

Pour la mise en couleur je vais faire des essais pour voir, il y a un autre truc sympa pour les watches :
(Evidement c'est animé, il suffit d'historiser les valeurs.)

Fichier(s) joint(s):
004.png
004.png [ 39.93 Kio | Vu 645 fois ]


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 23 Nov 2022, 14:02 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 419
Localisation: Var
J'ai ajouté une boite de dialogue pour suivre l'allocation des objets dans le moteur de jeu.
Il n'y a pas de spécifique à la démo Sonic, on utilise des étiquette "standard" du moteur de jeu.
Y compris pour retrouver les noms des objets (étiquettes commençant par ObjID_)
Donc ça fonctionne pour n'importe quelle démo déjà réalisée avec ce moteur.

https://youtu.be/GDq_b3KsrZQ
phpBB [video]


Suite à ça on voit qu'on peut améliorer l'instanciation des objets :
- ajout d'un test de position verticale pour allouer/désallouer les objets (actuellement uniquement fait sur l'axe x) => ça je le savais déjà
- diminution de la proximité d'allocation à mettre en place pour certains objets (immobiles, ...) => c'est là ou l'outil de debug va aider a tester / valider la distance d'allocation en fonction de la position camera.
A la fin de la vidéo on a une belle collection d'objets ... clairement c'est trop, il faut désallouer ces pics avec une distance plus petite à la camera.
On voit aussi la capacité des slots, pour le moment il en reste ... mais on n'a pas encore tous les objets.

Pour certains objets (ennemis se déplaçant) il est cependant nécessaire de conserver une désallocation un peu "lâche", ce qui permet de les faire se déplacer en bordure d'écran sans qu'il perde son "action/déplacement" en cours dès qu'il n'est plus affiché.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 23 Nov 2022, 17:06 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1769
Localisation: Brest
Wahou c'est super ce moniteur du moteur de jeu. :love:

Par contre le FPS à 45+imgs/sec, ne me semble pas réaliste. Tu fais tourner l'émul à x4 ?

Je vois aussi qu'il y a un objet "spring", or je ne l'ai jamais vu à l'écran. Il se planque où dans le décors ?

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 23 Nov 2022, 17:19 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 419
Localisation: Var
le fps c'est celui du debugger (boucle de rendu DearImGui) :D
ça me permet de voir le taux de refresh des données de debug, l'emul tourne bien a la vitesse normale.

L'objet spring est instancié mais le code est "vide", je n'ai pas chargé encore les graphismes (les .png sont prêts).


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 12 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com