Technique de debuggage
tablier
Membre
Je travaille sur un émulateur qui utilise SDL. Le changement de certains réglages de l'émulateur oblige à faire un reset pour être pris en compte. Parmi les réglages qui demandent un reset, ceux liés aux changement de taille de l'écran du simulateur provoquent un crash à l'intérieur de SDL. Du moins c'est ce que montre le debugger d'Xcode (voir image)
Pour résoudre cela, j'ai essayé d'introduire les sources de SDL dans le projet de l'émulateur, mais je n'y arrive pas: erreurs, erreurs .... que je n'arrive pas à supprimer.
Une autre solution serait d'introduire le projet SDL dans le projet de l'émulateur (sans le changer) pour debugger les deux ensemble. Mais ça je ne sais pas faire!
Comment cela se fait-il?
Y-a-t-il d'autres solutions?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
ça consiste en quoi ton reset, tu détruis et tu recrée une vue ou une fenêtre ?
Je ne connais pas vraiment les zombies, mais c'est une occasion pour apprendre.
Mon problème est qu'ayant utilisé cet émulateur j'ai constaté que la version linux marchait bien, mais la version OSx plantait sur certains Reset. Je ne connais ni l'émulateur ni SDL qui sont écrits en C (je découvre). J'essaie d'aider le développeur qui à écrit l'interface pour OSx (4 fichiers .m sur 118 fichiers au total) et qui ne se sort pas de ce problème. Donc je ne sais pas très exactement ce que fait le reset, mais je constate que le crash se produit au reset obligatoire après un changement de résolution de la fenêtre de l'Atari. Pas de crash avec les autres reset obligatoires!
Bon, je vais allez voir les zombies (ça fait macabre).
On appelle "zombie" un objet artificiellement gardé en mémoire par le debugger alors que son retain count est à zéro et qu'il aurait été normalement évacué de la mémoire.
L'option "Zombies activés" permet de voir si ton code fait appel à des objets qui en principe n'existent plus. Sans cette option, un tel appel provoque un EXEC_BAD_ACCESS.
Donc l'objet ne devient un zombie que si le programmeur le souhaite. Son destin normal est de défunter. C'est toi qui joues les sorciers vaudous, en quelque sorte...
Mon intuition c'est que SDL essaye de dessiner sur une surface qui n'existe plus puisque tu es en train de faire un reset.
Voilà pourquoi je demandais si le reset provoque la destruction de la fenêtre et la création d'une nouvelle fenêtre.
Bon je viens de jouer avec quelques minutes (bien que j'étais plutôt amiga...).
Après avoir activé les zombies, voici le log:
Un message a été envoyé à un objet NSWindowGraphicsContext qui n'est plus là puisqu'on a fermé la fenêtre de l'émulateur.
La fonction suivante n'est pas implémentée et je pense que cela pose problème :
void Control_ReparentWindow(int width, int height, bool noembed)
{
/* TODO: implement the Windows part. SDL sources offer example */
Log_Printf(LOG_TODO, "Support for Hatari window reparenting not built in\n");
}
Merci pour cette aide.
1 je vais utiliser zombies pour bien comprendre la chose.
2 je vais conseiller au développeur en question de consulter ce post et éventuellement de s'inscrire sur ce forum.