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

C++ Discussion :

segmentation fault, multithread et debogage..


Sujet :

C++

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut segmentation fault, multithread et debogage..
    bonjour,

    j'ai un probleme qui me laisse perplexe.. j'ai un programme en multi thread, les threads partageant des données.

    or, je me recupere une segmentation fault, plus exactement un message comme quoi je delete un pointeur qui l'a deja été... seulement, je n'utilise pas de pointeur (enfin, pas directement, j'utilise des vector), et j'ai beau lire et relire, chaque acces a une donnée partagée est verrouillé par un mutex. comme je peux choisir le nombre de thread, je l'ai fixé a un, et ca marche, donc c'est bien du multithread que ca vient..

    le hic : gdb ne m'indique pas precisement ou ca se passe, donc je n'ai aucune idee d'ou ca peut venir.. une seule fois, il a pointe une ligne de ma fonction passé dans les threads, et c'etait une ligne qui ne manipulait que des variables locales. a force d'affichage de "hip" et de "hop" (technique ultime de debogage :-) ), il semble bien que le probleme survient quand les threads se "croisent'.. mais je n'arrive pas a savoir ou. je ne peux pas vous poster tout le code, ca serait un peu long, mais :

    - avez vous une piste ? un truc a verifier..
    - connaitriez vous une astuce pour forcer gdb a retrouver exactement ou ca se passe ?

    mon erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    *** glibc detected *** double free or corruption (!prev): x0000000000512ae0 ***
    (parfois ca marque top au lieu de prev..)

    gdb me sort :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Program received signal SIGABRT, Aborted.
    [Switching to Thread 1077942624 (LWP 25001)]
    0x00002aaaab16543a in raise () from /lib64/tls/libc.so.6
    (gdb) bt
    #0  0x00002aaaab16543a in raise () from /lib64/tls/libc.so.6
    #1  0x00002aaaab166870 in abort () from /lib64/tls/libc.so.6
    #2  0x00002aaaab19b06e in __libc_message () from /lib64/tls/libc.so.6
    #3  0x00002aaaab1a040c in malloc_printerr () from /lib64/tls/libc.so.6
    #4  0x00002aaaab1a0e9c in free () from /lib64/tls/libc.so.6
    #5  0x00000000004031c2 in processus () at new_allocator.h:109
    #6  0x00002aaaaabd0a37 in boost::thread_group::create_thread () from /usr/lib64/libboost_thread-gcc-mt-1_33.so.1.33.0
    #7  0x00002aaaab470fa5 in start_thread () from /lib64/tls/libpthread.so.0
    #8  0x00002aaaab1f3cb2 in clone () from /lib64/tls/libc.so.6
    a la frame 5, "processus" est le nom de la fonction que je passe au thread.
    et enfin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    frame 5
    #5  0x00000000004031c2 in processus () at new_allocator.h:109
    109           destroy(pointer __p) { __p->~_Tp(); }
    comme vous le voyez, gdb pointe vers la fonction qui efface, pas vers la variable responsable... je pense que cela vient d'un des vecteurs, vu que je n'appelle pas moi meme de delete, donc ca doit venir d'un destructer de classE. bref, les threads se marchent sur les pompes, et je ne sais pas d'ou ca vient !! j'ai pourtant des mutex de partout.. juste au cas ou, ya juste une fois ou il a pointé vers ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(i=0;i<nbData;i++) 
    {
    	current=contract(x[i],current,contraintesR[i],contraintesI[i],relax);
    	if(isEmpty(current)) break;
    }
    contract est une fonction externe qui n'a donc pas acces aux variables globales, current est un vector, x et les contraintes sont globales, mais passé en const :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    inline pave contract(const REEL& x, const pave& param,const interval& yr,const interval& yi, const int& nbRelaxation)
    voila, j'ai donné le maximum de detail, mais je seche.. c'est vraiment venu d'un coup, je ne vois vraiment pas ce que j'ai pu changer..

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tu es sûr que ton vector existe toujours quand tu veux y accéder ? (pas de référence et autre dangling pointer ?)

    Tu as bien compilé pour du multithread ?
    Tu as une option à utiliser avec GCC pour la compilation, et toutes les bibliothèques que tu utilises et avec lesquelles tu te lies doivent avoir été compilées pour du MT.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    a priori, je n'utilise pas d'autre librairie que boost, qui me sert justement a faire ce MT. je ne savais pas qu'il y avait une option sepciale pour gcc, ca vient peut etre de la ?? mais je precise que ca marchait pas mal, jusqu'a que je bidouille 2 3 trucs qui n'ont rien a voir, et en tout cas je n'ai pas touché a cette partie du code ! pas une ligne de la fonction processus...

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    &#@çç~! si je puis me permettre.. je crois que j'ai trouvé.. j'y suis depuis midi, quand meme, pour me rendre compte que j'utilisais 2 mutex different pour une meme ressource.. erreur de copier coller, j'ai rajoute une ressource, donc rajouté un mutex, donc gnark.. forcement, ca arrivait que l'un prenne pendant que l'autre pose et scrach..

    désolé pour le derangement.. corollaire de la loi de murphy : apres X heures a chercher, c'est une fois rendu publique votre probleme que vous decouvrez a quel point il est idiot

    je vais quand meme mettre resolu, pour la forme..

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

Discussions similaires

  1. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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