Des fois, on a beau chercher, on a beau logger, on a beau débugger, on ne trouve pas. On vient même à se demander si ce n'est pas le compilateur qui bugge. Vous est-ce déjà arrivé?
--------
Un exemple partiel de log:
Ce log est créé par la fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Surface::colorkey debug 1 Color::map debug 1 Color:: map debug 2 freeing 0x2955648 (refcount: 1) Surface::colorkey debug 2
Je cherche où la ligne en rouge a pu être produite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 /* Change le colorkey de la surface avec la nouvelle couleur */ void Surface::colorkey(const Color &color) { fprintf(stderr,"Surface::colorkey debug 1\n"); if (SDL_SetColorKey(s,SDL_SRCCOLORKEY|SDL_RLEACCEL, color.map(s)) < 0) throw InterfaceException("Surface::colorkey -- error"); fprintf(stderr,"Surface::colorkey debug 2\n"); }
La ligne rouge est lancée quand on fait un appel à SDL_FreeSurface():
Je dois donc trouver où l'on fait appel à SDL_FreeSurface...
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define SDL_FreeSurface(s) {fprintf(stderr, "freeing 0x%x (refcount: %d)\n", s, (s)?s->refcount:0); SDL_FreeSurface(s);}
D'après le log, c'est dans cette ligne:
Le code de la fonction color.map est le suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part SDL_SetColorKey(s,SDL_SRCCOLORKEY|SDL_RLEACCEL, color.map(s))
Toujours d'après le log, la ligne rouge ne vient pas de la fonction Color::map...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Uint32 Color::map(const Surface &s) const { fprintf (stderr, "Color::map debug 1\n"); Uint32 res = SDL_MapRGB(s.s->format, r,g,b); fprintf (stderr, "Color:: map debug 2\n"); return res; }
Donc la ligne rouge viendrait de la fonction SDL_SetColorKey, fonction éprouvée de la librairie SDL.
Enfin, pour cela, encore faudrait-il qu'elle fasse appel à SDL_FreeSurface...
Voici sa déclaration dans son header:
Pas de SDL_FreeSurface en vue... En plus vu que j'ai redéfini SDL_FreeSurface par une macro après l'inclusion du header, même si SDL_FreeSurface était présent dans le header, ça changerait pas grand chose...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 /* ... */ extern DECLSPEC int SDLCALL SDL_SetColorKey (SDL_Surface *surface, Uint32 flag, Uint32 key);
Pourtant, la ligne en rouge dit qu'il y a un SDL_FreeSurface quelque part. Alors quoi? Erreur du compilateur? Il s'amuse à rajouter des lignes dans le programme?
----
Si vous aussi vous avez des expériences à partager, n'hésitez pas!
Partager