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 :

Erreur de segmentation(core dumped) - SDL2 - c++


Sujet :

SDL

  1. #1
    Candidat au Club
    Homme Profil pro
    technicien
    Inscrit en
    Mai 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Mai 2020
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Erreur de segmentation(core dumped) - SDL2 - c++
    Bonjour,

    J'utilise la SDL2, lors de l'écriture du programme, j'ai souvent compilé pour voir si tout allait bien. Je refermais la fenêtre aussitôt. Le but étant de voir si les textures s'affichaient correctement.

    J'ai donc continué à coder, et maintenant que j'ai ajouté des tuiles, Lors de l'exécution, j'ai une erreur de segmentation au bout de quelques secondes...

    Je pense que j'avais déjà cette erreur depuis le début du programme, mais que je ne l'ai pas vue car je ne laissais pas la fenêtre ouverte assez longtemps.

    En regardant les forums, j'ai vu que je pouvais compiler avec -g3 ou -w avec make, et déboguer avec gdb.

    mais quand je fais ça, gdb me donne cela :

    [Thread debugging using libthread_db enabled]
    Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
    [New Thread 0x7ffff480a700 (LWP 9154)]

    Thread 1 "exe" received signal SIGSEGV, Segmentation fault.
    0x00007ffff4fe4540 in ?? () from /usr/lib/x86_64-linux-gnu/dri/i965_dri.so
    je n'avais utilisé gdb, mais je pense que le "??" est censé me donner l'endroit ou a lieu l'erreur.

    Avez-vous d'autre idées qui pourrait m'aider à trouver le lieu de l'erreur ?

    Si vous avez déjà utilisé la SDL2, savez-vous quelle type de structure faut-il libérer ? (Je me dis que c'est peut-être un SDL_FreeSurface() qui manque, ou un pointeur qui ne pointe sur rien... )

    je vous fournis l'extrait de code qui, je pense, cause l'erreur :

    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
    void map::display( fenetre* window , int i , int j )
    {
        SDL_Rect rect_src;
        SDL_Rect rect_dest;
     
        SDL_Surface* loading_surf = SDL_LoadBMP( this->tuile_set->get_name().c_str() );
        if( loading_surf == NULL )
        {
            std::cout << "Erreur lors du chargement de l'image" << std::endl;
        }
        SDL_Texture* texture ;
     
        rect_src.x = ( (this->tab_map[j][i]) % this->tuile_set->get_nb_colone() ) * this->tuile_set->get_largeur_tuile();
        rect_src.y = ( (this->tab_map[j][i]) % this->tuile_set->get_nb_ligne() ) * this->tuile_set->get_hauteur_tuile();
        rect_src.w = this->tuile_set->get_largeur_tuile();
        rect_src.h = this->tuile_set->get_hauteur_tuile();
     
        rect_dest.x = i * this->tuile_set->get_largeur_tuile();
        rect_dest.y = j * this->tuile_set->get_hauteur_tuile();
        rect_dest.w = this->tuile_set->get_largeur_tuile();
        rect_dest.h = this->tuile_set->get_hauteur_tuile();
     
        texture = SDL_CreateTextureFromSurface( window->get_renderer() , loading_surf );
        SDL_FreeSurface( loading_surf );
        SDL_RenderCopy( window->get_renderer() , texture , &rect_src , &rect_dest );
    };
    j'ai aussi testé valgrind pour voir si il y avait une fuite de mémoire, j'ai beaucoup trop d'erreurs pour les montrer, mais elles sont quasiment toutes identiques :

    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
    ==17195== Invalid write of size 4
    ==17195==    at 0x7A319F7: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
    ==17195==    by 0x7A0F7D7: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
    ==17195==    by 0x7AD7727: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
    ==17195==    by 0x7A11D8A: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
    ==17195==    by 0x7AB184D: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
    ==17195==    by 0x722BABD: ??? (in /usr/lib/x86_64-linux-gnu/libGLX_mesa.so.0.0.0)
    ==17195==    by 0x7105F22: ??? (in /usr/lib/x86_64-linux-gnu/libGLX.so.0.0.0)
    ==17195==    by 0x71075A0: ??? (in /usr/lib/x86_64-linux-gnu/libGLX.so.0.0.0)
    ==17195==    by 0x4942849: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.10.0)
    ==17195==    by 0x4914739: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.10.0)
    ==17195==    by 0x4916977: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.10.0)
    ==17195==    by 0x4917112: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.10.0)
    ==17195==  Address 0x7f0581ef609c is not stack'd, malloc'd or (recently) free'd
     
    ==17195==
    ==17195== 2984 errors in context 72 of 276:
    ==17195== Invalid write of size 4
    ==17195==    at 0x7F1E996: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
    ==17195==    by 0x8099AA2: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
    ==17195==    by 0x7A0B22C: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
    ==17195==    by 0x7A39E58: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
    ==17195==    by 0x7A3A3AB: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
    ==17195==    by 0x7A0F694: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
    ==17195==    by 0x7A4170A: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
    ==17195==    by 0x724CE46: ???
    ==17195==    by 0x4943306: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.10.0)
    ==17195==    by 0x10B27A: main (main.cpp:52)
    ==17195==  Address 0x7f0581ef21c4 is not stack'd, malloc'd or (recently) free'd
    ==17195==
    pour information, dans main.cpp ligne 52 il y a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            SDL_RenderPresent( window->get_renderer() );
    prototype de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SDL_Renderer* fenetre::get_renderer()
    {
        return this->m_renderer;
    };
    merci pour votre temps.

    Cordialement.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    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 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Bonjour,

    Au vu des résultats, je trouve que votre option de compilation -g3 (d'ailleurs, vous pouvez utiliser -g, tout court) ne fonctionne pas. Avez-vous enlevé les optimisations (enlever les -O2 ou -O3).
    Avec les informations de débogage (ajoutés par -g), vous devriez obtenir l'endroit dans votre programme où cela se passe mal. Sinon, lorsque le débogueur s'arrête sur le problème, il faut faire un bt pour obtenir la pile d'appels.
    Toutefois, on remarque que cela crash dans la pile graphique de Linux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texture = SDL_CreateTextureFromSurface( window->get_renderer() , loading_surf );
    Vous ne vérifiez pas si la fonction retourne une valeur correcte (sans erreur).

    Mais surtout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    texture = SDL_CreateTextureFromSurface( window->get_renderer() , loading_surf );
    SDL_FreeSurface( loading_surf );
    SDL_RenderCopy( window->get_renderer() , texture , &rect_src , &rect_dest );
    Vous supprimez (libérez) la surface avant le rendu. Je doute que ce soit très correct (libération de la mémoire pouvant être utilisée par le rendu).
    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.

  3. #3
    Candidat au Club
    Homme Profil pro
    technicien
    Inscrit en
    Mai 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Mai 2020
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    merci d'avoir pris le temps de me lire.

    Je prend note de votre retour. Au vus de mes recherche sur le sujet et votre retour, je pense qu'il serait nécessaire que je revois l'architecture du programme..

    J'aimerai toute fois ajouter que même avec une structure très simple de programme avec la SDL2, on peut voir plusieurs fuite de mémoire. Cela est certainement du a mon manque de connaissance, mais même avec des structures trouvées sur des tutoriels pour débutant, ce problème existe.
    Je ne suis pas dans le domaine de l'informatique, alors je ne sais pas si se sont des pertes acceptables, ou même si cela peut provenir du logiciel utilisé..
    Cela étant, je me posé la question sur la légitimité de pertes.

    Qu'en pensez vous ?

    Cordialement.
    Covinha.

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Si tu as des fuites de mémoire en C++ , cela veut dire que tu programme du C en C++ ou alors que tu utilise mal la SDL.

    Après tout dépend de ce que tu souhaite faire , le C ou C++ avec la SDL est pas vraiment adapté pour faire du jeux vidéo , cela d’oblige à faire un moteur de jeux en général.
    Si ton seul but est de faire un jeux vidéo ben utilise un moteur de jeux deja existant sur un langage plus facile

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    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 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    J'aimerai toute fois ajouter que même avec une structure très simple de programme avec la SDL2, on peut voir plusieurs fuite de mémoire. Cela est certainement du a mon manque de connaissance, mais même avec des structures trouvées sur des tutoriels pour débutant, ce problème existe.
    Je ne suis pas dans le domaine de l'informatique, alors je ne sais pas si se sont des pertes acceptables, ou même si cela peut provenir du logiciel utilisé..
    Cela étant, je me posé la question sur la légitimité de pertes.

    Qu'en pensez vous ?
    J'en pense que moi aussi je me suis inquiété de ce genre de chose par le passé.
    Déjà, je tiens à vous féliciter pour le réflexe valgrind. Cela fait plaisir à voir et c'est une bonne de s'inquiéter de la propreté de son programme.

    Valgrind va suivre les allocations et dé-allocations de mémoire. Toutefois, il existe des cas, où, il peut voir une allocation mais que le programme s'arrête avant (les crash provoquent beaucoup de fuites ). Le cas le plus courant avec les bibliothèques (comme la SDL ou Qt et certainement d'autres) c'est que la bibliothèque va effectuer des choses avant votre main(), et après votre main(). Notamment, de l'allocation de mémoire. Mais valgrind, ne verra pas la déallocation, car valgrind va s'arrêter avant que cela se passe.
    Aussi, certaines bibliothèques font des choses bas niveau (notamment, la pile graphique de Linux). Ces actions font que valgrind ne peut pas toujours suivre ce qui se passe au niveau de la mémoire et donc, ne peut pas toujours donner un rapport très fiable (enfin si, mais il va considérer que tout ça, ce sont des problèmes à régler, alors que non).

    En bref. utilisez valgrind, c'est bien. Occupez vous en priorité des erreurs provenant de votre programme et cela devrait suffire.
    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.

  6. #6
    Candidat au Club
    Homme Profil pro
    technicien
    Inscrit en
    Mai 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Mai 2020
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci pour vos réponses.

    Kannagi , je vais quand même persévérer sur le C++. Pour le moment les moteurs sont trop compliqués pour moi, j'ai du mal à travailler avec leurs API, je pense qu'un framework comme la SDL2 est un bon début. Le jeu n'est pas la finalité. Mon objectif est juste de coder.

    LittleWhite , oui, je comprend, cela explique pourquoi même avec une structure très simple, on peut voir des désallocation manquante, qui ne le sont pas.. J'avais continuer a chercher des solutions, mes elles vont toutes dans le même sens : je dois retravailler la structure du programme.

    Merci pour vos réponse qui sont très constructives, je n'ai plus de question, je met le sujet en résolu.

    Cordialement,
    Covinha.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Tu charges la surface à chaque fois que tu veux l'afficher. Niveau performance on est dans du très mauvais.
    Mais surtout tu ne libères jamais la texture utilisée pour l'affichage. À chaque affichage.
    Donc en plus d'avoir des performances tuées, tu as une fuite mémoire évidente.

    Vous supprimez (libérez) la surface avant le rendu. Je doute que ce soit très correct (libération de la mémoire pouvant être utilisée par le rendu).
    C'est correct. Une fois la texture créée, la surface d'origine est inutile pour son affichage.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Candidat au Club
    Homme Profil pro
    technicien
    Inscrit en
    Mai 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Mai 2020
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    J'ai tenu comte de vos remarques. Je m'applique à faire un code de qualité. Mais je ne connais pas de méthode ou outil qui me permette de juger la qualité du code.
    Connaissez vous des outils qui pourrait me permettre cela ? Notamment qui vérifie les allocations / désallocations mémoire ?

    Je suis reparti de zero, et je vérifie avec valgrind a chaque étape du code. Je ne pense pas que cela soit une bonne méthode de travaille..
    Si vous avez des conseilles, je suis preneur.

    Cordialement,
    Covinha.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    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 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Vous pouvez utiliser des analyseurs statiques (cpplint) de code ainsi que des formatteur de code (clang-format).
    Aussi, avez-vous bien activer tous les messages d'avertissements du compilateurs ? (-Wall -Wextra pour GCC)
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de segmentation (core dumped)
    Par benja507 dans le forum Débuter
    Réponses: 11
    Dernier message: 14/05/2008, 18h37
  2. Erreur de segmentation (core dumped)
    Par mansour67 dans le forum wxWidgets
    Réponses: 3
    Dernier message: 05/03/2008, 19h11
  3. Réponses: 6
    Dernier message: 14/01/2008, 17h47
  4. erreur de segmentation core dumped
    Par panganino dans le forum Langage
    Réponses: 2
    Dernier message: 03/01/2008, 13h45
  5. Réponses: 5
    Dernier message: 04/11/2007, 14h39

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