probleme thread linux (pthread) - C - Programmation
Marsh Posté le 17-08-2009 à 15:23:10
Quel est le problème?
Marsh Posté le 17-08-2009 à 15:27:26
J'ai ce genre d'erreur :
*** glibc detected *** ./main: corrupted double-linked list: 0x09fe3b58 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7dcb07f]
/lib/tls/i686/cmov/libc.so.6[0xb7dccb8d]
/lib/tls/i686/cmov/libc.so.6(__libc_calloc+0xef)[0xb7dce6ef]
/usr/local/lib/libcurl.so.4(Curl_open+0x36)[0xb7ef8226]
/usr/local/lib/libcurl.so.4(curl_easy_init+0x37)[0xb7f06697]
./main[0x8049aec]
/lib/tls/i686/cmov/libpthread.so.0[0xb7ec44ff]
/lib/tls/i686/cmov/libc.so.6(clone+0x5e)[0xb7e3f49e]
etc............
Parfois j'ai ça, parfois le programme se bloque (comme s'il ne recevait plus de connection...) dur dur
Marsh Posté le 17-08-2009 à 15:56:43
Alors ce n'est sans doute pas la solution, mais je dirais que
Code :
|
c'est moyen parce que rien n'indique que le thread a eu le temps de se servir de ton pointeur avant que tu ne libères la mémoire. Tu devrais libérer dans le thread je pense.
Marsh Posté le 17-08-2009 à 16:11:49
je vais essayer cette solution pourquoi pas !
je ne savais pas qu'il est possible de libérer dans le thread l"élément passé en paramètre
Marsh Posté le 17-08-2009 à 16:19:17
Ton élément n'est qu'un pointeur, pas la zone mémoire en question.
Essaie:
Code :
|
Tu verras qu'il n'y a pas de problème. z peut aussi être défini dans une autre fonction. Par contre il ne faut pas oublier de libérer la mémoire et de ne pas le faire deux fois.
Marsh Posté le 17-08-2009 à 16:23:20
bon ça a l'air de marcher un chouillia mieux (j'ai enlever le usleep aussi)
je traite bien une quinzaine de threads et le glibc error arrive d'un coup
Marsh Posté le 17-08-2009 à 16:26:31
j'ai mis :
// libération de la structure :
if(((struct infosThread *)(ptr))->cRequetteHTTP !=NULL){
free(((struct infosThread *)(ptr))->cRequetteHTTP);
((struct infosThread *)(ptr))->cRequetteHTTP= NULL;
}
if(ptr!=NULL){
free(ptr);
ptr = NULL;
}
a la fin de la fonction threadé
Marsh Posté le 17-08-2009 à 16:30:57
je ne pense pas que ce soit ça l'erreur, car si je commente les free(structure) que ce soit dans la fonction thréadé ou dans la boucle, ça plante de la même manière !
Marsh Posté le 17-08-2009 à 16:33:22
Utilise un debugger pour trouver la ligne qui plante. Vu d'ici avec juste un bout de code et une erreur ce n'est pas facile. Surtout que honnêtement, je n'ai pas tout lu XD. Je pense que si tu arrives à trouver l'instruction qui fait tout tomber, tu pourrais identifier le problème.
Ca ne plantait pas parce que tu avais de la chance et que le thread copiait les infos avant qu'elles ne soient détruites.
Si ptr est NULL, tu auras une segmentation fault sur if(((struct infosThread *)(ptr))->cRequetteHTTP !=NULL). Vérifie d'abord ptr avant ptr->cRequetteHTTP. Par contre les free sont dans le bon ordre.
(Je l'avais dit que ça n'était sûrement pas le problème: tu aurais eu seg fault comme message d'erreur)
Au fait la pile d'appels de ton message d'erreur parle de curl. Tu appelles peut-être une fonction de cette bibliothèque en lui donnant une variable avec du caca dedans...
Marsh Posté le 17-08-2009 à 17:38:33
Oué, débugguage de programme multi-threadé en C, des heures de plaisir en vue
Le genre d'erreur que tu obtiens, ça pu à plein nez le buffer overflow, erreur assez difficile à corriger.
Déjà, dans ce pavé, il y a une ligne qui devrait t'arracher les yeux :
Code :
|
Ce qui n'est pas gagné, car si tu fais ce genre d'erreur sur des trucs aussi simple, tu vas en chier pour la suite.
Marsh Posté le 17-08-2009 à 17:45:31
je ne comprend pas, quelle est l"erreur mon ami ? je ne suis sans doute pas un pro comme toi
Marsh Posté le 17-08-2009 à 17:53:18
Hmm, pas besoin d'être un pro pour comprendre ton erreur. Pour la débusquer au milieu du tas, il faut de l'expérience, certes. Mais maintenant que que je te l'ai montrée, tu dois comprendre ce qui ne vas pas, parce que c'est la base du C. Si tu ne veux pas faire cet effort, j'ai sincèrement peur pour la suite de ton projet.
Surtout que j'ai juste survolé ton code, rien ne dit que c'est l'unique erreur qu'il puisse y avoir.
Marsh Posté le 17-08-2009 à 18:01:45
tu me serai d'une grande aide si tu pouvais m'aider.
ça fait vraiment un moment que je bloque !
j'ai beau cherché je ne comprend pas mon erreur...
Marsh Posté le 17-08-2009 à 18:14:48
j'ai fait :
if(iSizeRequetteHTTP == strlen(((struct infosThread *)(ptr))->cRequetteHTTP)){
strcpy(requestHTTP,((struct infosThread *)(ptr))->cRequetteHTTP);
}else{
printf("probleme taille !!!!\n" );
}
et il arrive quon n'est pas la même taille... tu métonnes que ça narrive pas a bien copié !
mais alors pourquoi en faisant
iSizeRequetteHTTP = ((struct infosThread *)(ptr))->iSizeRequetteHTTP;
2 lignes après ils sont différents !! ça mépate là
Marsh Posté le 17-08-2009 à 15:20:27
Bonjour,
J'ai un problème de threads sous linux ubuntu 9.04.
Je code en C avec la bibliothèque <sys/socket.h>.
Avant de poster le code j'explique mon probleme :
Je dois réaliser un module de gestion de message (HTTP/TCP),
et je me place entre un serveur S et un client C.
J'utilise LibCurl pour quelques étapes.
L'étape 1 consiste à réceptionner une requete HTTP de C
L'étape 2 consiste à la renvoyer à S.
S nous répond, on réceptionne la requette et on la relance a C.
Dans le principe, c'est simple. Mais l'on reçoit une cinquantaine de requete HTTP de C,
donc l'emploi des threads s'impose, et là c'est le drame (corruption de mémoire, etc.)
Il faut savoir que si je met les threads en mode JOIN, le programme marche !
Mais le but est bien entendu de lancer les 50 threads d'un coup, pas l'un a la suite de l'autre.
Voici la partie principale du code :
Voici la fonction threadée :