IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

SDL_mixer double free or corruption


Sujet :

SDL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut SDL_mixer double free or corruption
    Bonjour à tous,

    Je débute actuellement avec la SDL, et je rencontre un souci avec SDL_MIXER que je ne comprends pas.
    Le but est de simplement jouer une musique en boucle, pour ce faire je lance depuis le main.c un appel à ma fonction playmusic contenu dans mon fichier sound.c

    Tout d'abord le code

    main.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	if (Mix_PlayingMusic() != 1) {
    		printf("playmusic !");
    		playmusic();
    		}
    sound.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ... Début de fichier 
    
    Mix_Music *music;
    
    ... Plus loin
    
    void playmusic(void) {
    	music = Mix_LoadMUS( "musique.mp3" );
    	 Mix_PlayMusic(music, -1);
    }
    
    void stopmusic(void) {
    	printf("test1");
    	Mix_FreeMusic(music); -> Crash 
    	printf("test2");
    }
    Dans mon sound.h appelé dans le main.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void playmusic( void );
    void stopmusic( void );
    Tout d'abord ça fonctionne bien j'ai bien le son c'est parfait, seulement mon programme figeait quand je le quittais, donc je pensais qu'il s'agissait d'un problème de libération de *music, du coup j'ai ajouté cette fonction stopmusic() pour quitter proprement en libérant *music
    Malheureusement avec cette nouvelle fonction mon programme ne fige plus mais crash avec double free or corruption (!prev): 0x00000000018dac10 ***

    Je suppose qu'il s'agit d'une erreur grossière, mais je ne vois pas

    Merci d'avance

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Oups j'oubliais j'ai aussi tenté de créer une fonction sound_init qui me permettrait de ne charger qu'une seule fois (ça me semblait plus propre), mais dans ce cas mon programme crash au lancement avec Erreur de segmentation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int sound_init( void ) {
    	music = Mix_LoadMUS( "musique.mp3" );

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Est-ce que la valeur du pointeur de "music" est toujours là même. Vous avez peut être un corruption du pointeur.
    Où sont vos MixInit()/MixQuit() ? Vous n'en parlez pas, j'espère qu'ils sont bien présent.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Merci pour votre réponse, un peu d'aide me rassure, je commence à m'arracher les (mon) cheveux.
    Comment puis-je afficher les valeurs du pointeur music ? Je constate juste qu'elle n'est pas null, je pense justement qu'il s'agit d'un problème de portée mais je ne comprends pas pourquoi

    En fait je suis obligé de déclarer music = Mix_LoadMUS( "musique.mp3" ); dans playmusic() pour avoir du son

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void playmusic(void) {
    	music = Mix_LoadMUS( "musique.mp3" );
    	Mix_PlayMusic(music, -1);
    }
    Partout ailleurs ça ne fonctionne plus, j'ai essayé dans le main.c et au début de sound.c idem ça ne fonctionne pas

    En ce qui concerne Mix_Init() et Mix_Quit() je n'ai rien vu dans les tutos j'ai dû manquer quelque chose, je suis en sdl 1.2
    Voici le code maintenant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void playmusic(void) {
     
    	if((Mix_Init(MIX_INIT_MP3)&MIX_INIT_MP3)!=MIX_INIT_MP3)
    	{
    		 printf("Mix_Init error: %s",Mix_GetError());
    	}
    	music = Mix_LoadMUS( "musique.mp3" );
    	Mix_PlayMusic(music, -1);
    }
     
    void stopmusic(void) {
    	printf("test1 \n");
    	Mix_Quit();
    	printf("test2 \n");
    }
    Malheureusement quand je quitte j'ai
    playmusic !Mix_Init error: Mixer not built with MP3 support 
    test1 
    test2 
    *** Error in `./test': corrupted double-linked list: 0x00000000026abbb0 ***
    Abandon (core dumped)
    Pour être complet je joue aussi des sons avec Mix_LoadWAV que je purge avec Mix_FreeChunk, quand je regarde avec gdb j'ai l'impression que le problème est lié
    #6  0x0000000000411c25 in sound_free () at sound.c:53
    #7  0x00000000004038ce in clean_up () at main.c:28
    #8  0x0000000000403b39 in main (argc=1, arvg=0x7fffffffe098) at main.c:167
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	for( i = 0 ; i < NUM_SOUNDS ; i++ ) {
    		if( sounds[i] ) {
    			Mix_FreeChunk( sounds[i] ); -> Ligne 53
    			sounds[i] = NULL;
    		}
    	}
    	stopmusic(); 
    	sound_close_mixer();
    Toutefois sans musique ça fonctionne super bien, je ne vois pas le rapport

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    J'ai ajouté un printf dans la fonction ou je charge mes bruitages

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	for( i = 0 ; i < NUM_SOUNDS ; i++ ) {
    		sounds[i] = Mix_LoadWAV( config_get()->iface.theme.sounds[i] );
    		printf("sound %s *\n", config_get()->iface.theme.sounds[i]);
    		if( sounds[i] == NULL ) {
    			fprintf( stderr, "Warning: Unable to open sound: %s\n", config_get()->iface.theme.sounds[i] );
    		}
    	}
    sound /usr/share/test/sounds/back.wav *
    sound /usr/share/test/sounds/blip.wav *
    sound /usr/share/test/sounds/no.wav *
    sound /usr/share/test/sounds/select.wav *

    Pas d'erreur aucun rapport avec le mp3

    Du coup j'ai fais pareil quand je libère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	for( i = 0 ; i < NUM_SOUNDS ; i++ ) {
    		if( sounds[i] ) {
    			Mix_FreeChunk( sounds[i] );
    			printf("\n sound %d numsounds %d \n", i, NUM_SOUNDS);
    			sounds[i] = NULL;
    		}
    	}
    Je stop au troisième

    sound 0 numsounds 4

    sound 1 numsounds 4

    sound 2 numsounds 4
    *** Error in `./test': corrupted double-linked list: 0x00000000012c5ca0 ***
    Abandon (core dumped)

    Ou parfois, aléatoirement, ça fige à la fin SDL_QUIT

    Si je commente la partie musique ça fonctionne

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bon, il semble que vous avez une corruption de mémoire.
    Pour le MP3, il semble que vous ne puissiez pas en lire (peut être simplement car il manque la DLL). Du moins, le message de Mix_Init est clair.
    Pour afficher un pointeur, il suffit d'utiliser %p dans un printf().

    Si vous êtes sous Linux, je vous conseille d'utiliser valgrind pour traquer le problème avec la mémoire.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    J'ai effectivement ce message

    playmusic !Mix_Init error: Mixer not built with MP3 support

    Mais ça fonctionne j'ai bien le son de mon mp3 sans souci, d'ailleurs quand je suis les tutos je n'ai jamais utilisé mix_init et ça fonctionne bien c'est étrange.
    J'ai ajouté des printf pour les pointeurs la bonne nouvelle c'est que l'adresse de music ne change pas

    Music dans playmusic = 0x1aa5a70 -> Lors de l’initialisation
    Music dans sound_free = 0x1aa5a70 -> Fonction pour la libéralisation du son

    sound 0 numsounds 4 sound=0x1a62390

    sound 1 numsounds 4 sound=0x1a88cc0

    sound 2 numsounds 4 sound=0x1a7e070
    *** Error in `./test': corrupted double-linked list: 0x0000000001adfcd0 ***

    Concernant valgrind le comportement est différent il va bien jusqu'à la fin du programme sans crasher, mais j'avoue que je comprend pas le résultat ...
    http://pastebin.com/Z99ZaaPE

    Dans ma fonction, j'ai ajouté ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	for( i = 0 ; i < NUM_SOUNDS ; i++ ) {
    		if( sounds[i] ) {
    			printf("\n before sound %d numsounds %d sound=%p\n", i, NUM_SOUNDS,sounds[i]);
    			Mix_FreeChunk( sounds[i] );
    			sounds[i] = NULL;
    			printf("\n after sound %d numsounds %d sound=%p\n", i, NUM_SOUNDS,sounds[i]);
    		}
    	}
    Ce qui donne
    Music dans playmusic = 0x153b390

    Music dans sound_free = 0x153b390

    before sound 0 numsounds 4 sound=0x1514450

    after sound 0 numsounds 4 sound=(nil)

    before sound 1 numsounds 4 sound=0x1539cb0

    after sound 1 numsounds 4 sound=(nil)

    before sound 2 numsounds 4 sound=0x152ef90

    after sound 2 numsounds 4 sound=(nil)

    before sound 3 numsounds 4 sound=0x152efb0 -> Au quatrième son crash, sauf si je ne joue pas de musique , comme ça je ne vois pas de rapport ?

    *** Error in `./test': corrupted double-linked list: 0x0000000001590cc0 ***
    Abandon (core dumped)
    On dirait que Mix_LoadMUS et Mix_LoadWAV partage quelque chose en commun

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Il y a un exemple d'utilisation ici : http://loka.developpez.com/tutoriel/sdl/sons/#LVII-B
    Peut être qu'il n'y a pas besoin d'utiliser ce Mix_Init() mais au minimum, un Mix_OpenAudio.

    De plus, j'aimerai bien que vous m'envoyez une archive de votre projet, pour que je fasse des tests.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup

    Réponse en PM

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Sympa la musique de fond (Remix de Xenon 2, s'il vous plait !).

    Pour ce projet, je trouve que c'est dommage de ne pas utiliser un truc comme CMake, ou autotools. Ou, au minimum, faire en sorte que par défaut (tant que l'on ne fait pas make install ?) le répertoire de data soit configuré sur `pwd`/data.
    Bon, je sais que c'est histoire de chemin de fichier de ressource, c'est trop la galère et tous les projets ont des soucis avec.
    Sinon, on pourrait imaginer une solution où, le code en lui même, cherche dans une série de répertoire, jusqu'à trouver le bon fichier (ou si la liste des répertoires possibles est finie), faire une sortie propre du programme.

    Bon, pour le programme en lui même.

    Si je le lance, ça marche. Si je quitte avec le bouton quit, ça marche encore.
    Si j'appuie sur select, ça plante (mais bon, j'ai pas de jeux, donc ça peut être lié , mais ça devrait pas planté).
    Par contre, je crache, si je quit presque tout de suite après le lancement O_o
    En même temps, la musique disait : "Don't touch that dude". Non ?
    Ok, ça marche une fois sur deux, donc l'hypothèse de la corruption de mémoire est vérifiée. Donc, la solution c'est :
    *** valgrind ***
    (que j'aime cet outil.)

    Dans le Makefile, vous devriez rajouter l'option (CFLAGS) -Wextra, c'est ultra bénéfique et ça va, de paire avec -Wall

    En théorie, il faut traiter toutes les erreurs de valgrind. Un programme qui tourne avec zéro erreur est un bon programme.
    ==25480== Conditional jump or move depends on uninitialised value(s)
    ==25480== at 0x77F7A8D: ____strtol_l_internal (in /lib64/libc-2.19.so)
    ==25480== by 0x10FBDC: config_read_rgb (config.c:348)
    ==25480== by 0x11334F: config_read_font (config.c:1291)
    ==25480== by 0x114715: config_read_theme (config.c:1650)
    ==25480== by 0x114DF5: config_read_themes (config.c:1766)
    ==25480== by 0x1153C4: config_read (config.c:1880)
    ==25480== by 0x1171B8: config_read_file (config.c:2373)
    ==25480== by 0x117309: config_load_themes (config.c:2400)
    ==25480== by 0x117773: config_open (config.c:2504)
    ==25480== by 0x10E8CA: main (main.c:59)
    (Je commence par celle qui touche le programme dont j'ai le code source en priorité.)
    On voit que valgrind nous donne un message explicatif de l'erreur et la callstack provoquant l'erreur. Ici, surement une variable non initialisée, utilisée dans un if. Voyons voir config.c:349

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char hex[3];
    strncpy( hex, value, 2 );
    rgb->red	= strtol( hex, NULL, 16 );

    En effet, le strtol, va faire une chose non valide. J'explique (car le raisonnement n'est pas immédiat).
    strncpy va copier au maximum 2 octets (dans un tableau de 3 octets). Le tableau fait 3 octets, car il fallait la place pour le '\0', sauf que là, strncpy rempli hex[0] et hex[1]. hex[2] n'a jamais de valeur assignée.
    On peut donc corriger par : char hex[3]={0};Qui remplit par défaut, le tableau de 0 (intégralement).

    Conseil du jour : toujours initialiser toutes les variables.
    Conseil 2 du jour : au vu de la signature de la fonction :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    int config_read_rgb( char *name, char *value, struct config_rgb *rgb )
    Autant que possible, constifier les variables. Ici, je propose (sans vérification) :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    int config_read_rgb( const char *name, const char *value, struct config_rgb *rgb )

    Bon, on corrige le code, on recompile, on relance dans valgrind et on continue.
    L'erreur a disparu (un bon bogue est un bogue qui n'est pas là).

    Nouveau problème :
    ==25746== Conditional jump or move depends on uninitialised value(s)
    ==25746== at 0x519EF82: ??? (in /usr/lib64/libSDL-1.2.so.0.11.4)
    ==25746== by 0x519F4FE: ??? (in /usr/lib64/libSDL-1.2.so.0.11.4)
    ==25746== by 0x519FE6A: ??? (in /usr/lib64/libSDL-1.2.so.0.11.4)
    ==25746== by 0x517588B: SDL_PumpEvents (in /usr/lib64/libSDL-1.2.so.0.11.4)
    ==25746== by 0x51758C8: SDL_PollEvent (in /usr/lib64/libSDL-1.2.so.0.11.4)
    ==25746== by 0x11F764: event_flush (event.c:93)
    ==25746== by 0x10E9F2: main (main.c:129)
    Allons dans event.c ligne 93
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void event_flush( void ) {
    	SDL_Event sdl_event;
    	while( SDL_PollEvent( &sdl_event ) );
    }

    Celui là, je ne sais pas trop. Le code me semble correct, donc, je passe.

    On arrive aux erreurs liées au son. Pour information, un "invalid write" équivaut à une erreur de segmentation. Si elle ne se produit pas, c'est simplement car le système estime que nous ne faisons pas encore des trucs trop invalide (bon il y a une explication un peu plus précise, expliquant que tant que l'on reste dans la mémoire de la page (souvent 4k) de notre programme, tout se passe "bien"). Mais en théorie, avec un système ultra stricte (embarqué) ou autre, une telle "invalid write" (ou read), vous explosez le système (freeze ).

    Une des erreurs indiquent sound.c : 101. Allons voir (les autres n'indiquent rien, car c'est du code qui tourne dans un thread et dans les bibliothèques ... du coup, on peut pas vraiment y faire quelque chose). Par contre, il faut savoir que bien souvent, s'il y a un problème dans une bibliothèque, c'est que c'est de notre faute (le monde est cruel, n'est ce pas).
    Ça tombe sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    music = Mix_LoadMUS( "musique.mp3" );
    Ça ne semble pas faux en soit. Dur dur de comprendre, du coup.

    Je lis la doc : https://www.libsdl.org/projects/SDL_..._mixer_11.html
    Je vois que tous les paramètres utilisés, sont corrects en soit. Pourtant, l'exemple indique d'autres paramètres (44k ...).
    Je test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) == -1 ) {
    Je compile. Le jeu tourne bien 1 fois, 2 fois, 3 fois, 4 fois, ...
    Je valgrind pour vérifier et là, je tombe miraculesement à 10 erreurs (en quittant rapidement le programme) alors que tout à l'heure, j'en avait 2000 après un crash immédiat, ou 50 000 après quelques secondes (lorsque ça arrive à tourner).

    Les erreurs rapportées sont, 2 fois l'histoire du PollEvent et un, qui se situe dans une section de ld.

    Donc le bogue du son se corrige ainsi.

    Je vous conseille de faire des tests sur les paramètres, car ici, nous en avons changé plusieurs à la fois. En les changeant les un derrière les autres, vous pourrez comprendre quel est le paramètre qui nous cassait les pieds.


    Maintent, on peut écouter le remix de la musique de Xenon II heureux
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Tout d'abord un grand merci ! Je regarde tout ça

    Une petite remarque concernant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if( Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) == -1 ) {
    Effectivement j'avais testé ceci,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void playmusic(void) {
            music = Mix_LoadMUS( "musique.mp3" );
            if( Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) == -1) 
                    Mix_PlayMusic(music, -1);
            printf("\nMusic dans playmusic = %p\n", music);
    }
    Et les crash avaient disparus, mais malheureusement dans ce cas je n'ai plus de musique
    Du coup en regardant plus haut dans le code je vois que l'auteur du code orginal avait mis ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     if( Mix_OpenAudio( 22050, AUDIO_S16SYS, 4, AUDIO_CHUNK_SIZE ) == -1 ) {
    Si je lis bien la doc la troisième valeur (4) me semble étrange, non ? Je test avec (2) en ce moment et tout me semble beaucoup mieux

    Bon il me reste 82 erreurs à corriger ...

  12. #12
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par stealth Voir le message
    Si je lis bien la doc la troisième valeur (4) me semble étrange, non ? Je test avec (2) en ce moment et tout me semble beaucoup mieux
    Il ne faut pas juste que cela semble mieux, mais que valgrind dise que c'est bien mieux.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Oui bien sûr mais disons que valgrind est encore très bavard ...
    Je vais regarder point par point

    J'ai 1830 erreurs + crash avec l'ancienne ligne et 83 sans crash avec la nouvelle

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Bon après un peu de travail je n'ai plus qu'une erreur

    ==21160== Conditional jump or move depends on uninitialised value(s)
    ==21160== at 0x50D4D4F: ??? (in /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0.11.4)
    ==21160== by 0x50D5303: ??? (in /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0.11.4)
    ==21160== by 0x50D5AFA: ??? (in /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0.11.4)
    ==21160== by 0x50ACE6B: SDL_PumpEvents (in /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0.11.4)
    ==21160== by 0x50ACEA8: SDL_PollEvent (in /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0.11.4)
    ==21160== by 0x41213B: event_flush (event.c:93)
    ==21160== by 0x403A2D: main (main.c:129)
    ==21160==
    ==21160==
    ==21160== HEAP SUMMARY:
    ==21160== in use at exit: 251,252 bytes in 1,408 blocks
    ==21160== total heap usage: 41,324 allocs, 39,916 frees, 21,756,267 bytes allocated
    ==21160==
    ==21160== LEAK SUMMARY:
    ==21160== definitely lost: 31,479 bytes in 468 blocks
    ==21160== indirectly lost: 2,288 bytes in 40 blocks
    ==21160== possibly lost: 0 bytes in 0 blocks
    ==21160== still reachable: 217,485 bytes in 900 blocks
    ==21160== suppressed: 0 bytes in 0 blocks
    ==21160== Rerun with --leak-check=full to see details of leaked memory
    ==21160==
    ==21160== For counts of detected and suppressed errors, rerun with: -v
    ==21160== Use --track-origins=yes to see where uninitialised values come from
    ==21160== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

    Merci encore pour les conseils

    Par contre quand je lance une vidéo (librairie ffmpeg) j'ai des milliers d'erreurs, il reste du boulot

  15. #15
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Cette erreur, j'en parlais dans mon message d'hier soir et je ne sais pas pourquoi l'erreur est présente. Je ferai des tests avec un programme d'expérimentation (pour isole le code est voir), mais je ne sais pas.
    Maintenant, vous allez rajouter l'option :
    --leak-check=full
    indiquée par valgrind et vous allez corriger le second problème : les fuites de mémoire (car valgrind peut les rapporter, ce qui en fait un excellent outil). D'ailleurs, il vous l'indiquait un peu :
    ==21160== HEAP SUMMARY:
    ==21160== in use at exit: 251,252 bytes in 1,408 blocks
    ==21160== total heap usage: 41,324 allocs, 39,916 frees, 21,756,267 bytes allocated
    ==21160==
    ==21160== LEAK SUMMARY:
    ==21160== definitely lost: 31,479 bytes in 468 blocks
    ==21160== indirectly lost: 2,288 bytes in 40 blocks
    ==21160== possibly lost: 0 bytes in 0 blocks
    ==21160== still reachable: 217,485 bytes in 900 blocks
    ==21160== suppressed: 0 bytes in 0 blocks
    Bon courage.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    J'ai bien progressé, toutefois je rencontre un comportement que je ne comprend pas avec Valgrind
    Sans option il ne me trouve qu'une erreur comme indiqué plus haut, toutefois avec --leak-check=full, il en trouve

    ==30192== For counts of detected and suppressed errors, rerun with: -v
    ==30192== Use --track-origins=yes to see where uninitialised values come from
    ==30192== ERROR SUMMARY: 111 errors from 110 contexts (suppressed: 0 from

    Ce sont toujours les mêmes (je veux dire quelles apparaissent plusieurs fois aux mêmes lignes dans la même session valgrind)

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    ==30192==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==30192==    by 0x5EDCA70: xmlBufCreateSize (in /usr/lib/x86_64-linux-gnu/libxml2.so.2.9.1)
    ==30192==    by 0x5E86899: xmlNodeGetContent (in /usr/lib/x86_64-linux-gnu/libxml2.so.2.9.1)
    ==30192==    by 0x407400: config_read_game_selector_tile (config.c:1191)
    ==30192==    by 0x4074F1: config_read_game_selector_tiles (config.c:1209)
    ==30192==    by 0x407812: config_read_game_selector (config.c:1253)
    ==30192==    by 0x408E54: config_read_theme (config.c:1677)
    ==30192==    by 0x4093AE: config_read_themes (config.c:1781)
    ==30192==    by 0x4098BD: config_read (config.c:1895)
    ==30192==    by 0x40B25C: config_read_file (config.c:2391)
    ==30192==    by 0x40B391: config_load_themes (config.c:2418)
    ==30192==    by 0x40B7A7: config_open (config.c:2521)
    ==30192== 
    ==30192== 792 bytes in 12 blocks are definitely lost in loss record 328 of 379
    Par exemple voici la ligne config.c:1677

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    651                 if( node->type == XML_ELEMENT_NODE ) {
    1652                         if( strcmp( (char*)node->name, tag_name ) == 0 ) {
    1653                                 strncpy( theme->name, (char*)xmlNodeGetContent(node), CONFIG_NAME_LENGTH );
    1654                         }
    1655                         else if( strcmp( (char*)node->name, tag_theme_background ) == 0 ) {
    1656                                 config_read_theme_background( node->children, theme );
    1657                         }
    1658                         else if( strcmp( (char*)node->name, tag_theme_font ) == 0 ) {
    1659                                 config_read_font( node->children, theme );
    1660                         }
    1661                         else if( strcmp( (char*)node->name, tag_theme_menu ) == 0 ) {
    1662                                 config_read_menu( node->children, &theme->menu );
    1663                         }
    1664                         else if( strcmp( (char*)node->name, tag_theme_submenu ) == 0 ) {
    1665                                 config_read_submenu( node->children, &theme->submenu );
    1666                         }
    1667                         else if( strcmp( (char*)node->name, tag_theme_sounds ) == 0 ) {
    1668                                 config_read_sounds( node->children, theme );
    1669                         }
    1670                         else if( strcmp( (char*)node->name, tag_theme_snap ) == 0 ) {
    1671                                 config_read_snap( node->children, &theme->snap );
    1672                         }
    1673                         else if( strcmp( (char*)node->name, tag_theme_hints ) == 0 ) {
    1674                                 config_read_hints( node->children, &theme->hints );
    1675                         }
    1676                         else if( strcmp( (char*)node->name, tag_theme_game_sel ) == 0 ) {
    1677                                 config_read_game_selector( node->children, &theme->game_sel );
    1678                         }
    1679                         else {
    1680                                 fprintf( stderr, warn_skip, tag_themes_theme, node->name );
    1681                         }
    1682                 }
    Pourquoi valgrind voit ces "erreurs" seulement en mode leak-check=full ?

  17. #17
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Car, dans le mode =full, il vérifie intensivement les fuites de mémoires (des malloc sans free et ce genre de chose). Comme son test est bien plus stricte, il repère plus d'erreurs.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Bon pour ce problème je ne vois vraiment pas où ça cloche, pour changer je vais passer à mon problème de vidéo (j'ai ouvert un autre post dans la partie Audio du forum)

    Merci encore

  19. #19
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    La fuite est sur l'appel à xmlNodeGetContent, souvent, car le pointeur retourné n'est pas correctement libéré (par une autre fonction de la bibliothèque XML).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/05/2019, 17h27
  2. [ProFTPd][glibc detected double free or corruption]
    Par Théolude dans le forum Administration système
    Réponses: 1
    Dernier message: 28/08/2008, 09h19
  3. [SFML] Image double free or corruption
    Par Belegkarnil dans le forum SFML
    Réponses: 4
    Dernier message: 23/08/2007, 16h56
  4. erreur glibc detected double free or corruption.
    Par Screwt-K dans le forum C++
    Réponses: 1
    Dernier message: 02/07/2007, 16h46
  5. Problème d'éxécution: double free or corruption
    Par ciol_tebroc dans le forum C++
    Réponses: 3
    Dernier message: 17/05/2006, 19h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo