Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur de segmentation (core dumped)

Erreur de segmentation - SDL2 - c++

Sujet résolu
    23 mai 2020 à 17:55:30

    Bonjour,

    J'utilise la SDL2, lors de l'écriture du programme, j'ai souvent compilé pour voir si tout allé bien. Je refermai la fenêtre aussi tot. Le but étant de voir si les textures s'affichées correctement.

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

    Je pense que j'avais deja cette erreur depuis le debut du programme, mais que je ne l'ai pas vu car je ne laissé pas la fenetre ouverte assez longtemps.

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

    mais quand je fais ca, 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 à lieu l'erreur.

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

    Si vous avez deja utilisé la SDL2, savez vous qu'elle type de structure faut-il liberer ? ( je me dit que c'est peut être un SDL_FreeSurface() qui manque, ou un pointeur qui ne pointe sur rien... )

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

    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 );
    };

    Edit :

    j'ai aussi tester valgrind pour voir si il y avait une fuite de mémoire, j'ai beaucoup trop d'erreur pour les montrer, mais elles sont casiment toutes identique :

    ==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 :

            SDL_RenderPresent( window->get_renderer() );

    prototype de la fonction :

    SDL_Renderer* fenetre::get_renderer()
    {
        return this->m_renderer;
    };

    merci pour votre temps.

    Cordialement.

    Edit :

    Pour les personnes qui se poseraient la même question (aussi précise soit-elle), la réponse est que l'architecture du programme est à revoir. Je fais beaucoup trop d'allocation pour très peu de libération mémoire.. dans une game loop..

    Cordialement.

    -
    Edité par JrRj 24 mai 2020 à 16:05:38

    • Partager sur Facebook
    • Partager sur Twitter

    Erreur de segmentation (core dumped)

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown