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 :
(parfois ca marque top au lieu de prev..)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 *** glibc detected *** double free or corruption (!prev): x0000000000512ae0 ***
gdb me sort :
a la frame 5, "processus" est le nom de la fonction que je passe au thread.
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
et enfin :
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 frame 5 #5 0x00000000004031c2 in processus () at new_allocator.h:109 109 destroy(pointer __p) { __p->~_Tp(); }
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
3
4
5
6 for(i=0;i<nbData;i++) { current=contract(x[i],current,contraintesR[i],contraintesI[i],relax); if(isEmpty(current)) break; }
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..
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)
Partager