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

Linux Discussion :

Passage d'arguments a un thread


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Passage d'arguments a un thread
    Sup'

    J'ai un petit probleme de segmentation fault avec mon programme.
    En gros, mon programme compte le nombre de ligne de tous les fichiers du dossier, en utilisant les threads de POSIX.

    Voici le code en question, et la trace GDB qui va avec.

    D'apres ce que j'ai compris sur les dernieres heures a lancer GDB et ltrace, le programme galere a la ligne 22, ou il est question de copie la structure passe en argument (args) dans la structure thread_info en locale. Puis la ligne 23 juste en dessous le fait planter, en faisant appel a tinfo->file, qui est vide.

    J'ai absolument aucune idee de pourquoi ca ne marche pas, j'ai pris exemple d'un autre programme ou je m'y prends de la meme maniere, et l'autre programme en question fonctionne parfaitement bien.

    Si quelqu'un a le temps de jeter un coup d'oeil dessus ce serait genial.

    Merci!

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour,

    ce n'est pas une question de GNU Linux. C'est une question d'informatique. (Même, une question pour le forum de ton langage, car tu ne dis pas si c'est du C)

    Quand on lit ceci
    En gros, mon programme compte le nombre de ligne de tous les fichiers du dossier
    on peut avoir envie de répondre que l'outil qui compte les retours à la ligne est "wc -l".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ cat $(< <(find . -iname '*.txt'))|wc -l
    39980

  3. #3
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    si on prend le temps de fouiller rapidement avec gdb on comprend assez vite ce qui se passe pourtant
    on se permet de compiler avec les symboles de débogage gcc -Wall -ggdb pouet.c -lpthread -o pouet
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    $ gdb -q ./pouet
    Reading symbols from /home/machin/tests/dvp/coin/pouet...done.
    (gdb) set disassembly-flavor intel
    (gdb) set follow-fork-mode child
    (gdb) list 23,24
    23          printf("%s\n", tinfo->file);
    24          char *line;
    (gdb) b 24
    Breakpoint 1 at 0x400b72: file pouet.c, line 24.
    (gdb) list 68,68
    68          pthread_create(&tinfo->thread_id, &attr, count_lines, &tinfo);
    (gdb) b 68
    Breakpoint 2 at 0x400d12: file pouet.c, line 68.
    (gdb) r
    Starting program: /home/machin/tests/dvp/coin/./pouet
    (...)
    Breakpoint 2, main (argc=1, argv=0x7fffffffe1a8) at pouet.c:68
    68          pthread_create(&tinfo->thread_id, &attr, count_lines, &tinfo);
    (gdb) print tinfo
    $1 = (struct thread_info *) 0x60b050
    (gdb) print *tinfo
    $2 = {thread_id = 0, thread_num = 0, file = 0x400e5c "contributors.txt", current_dir = 0x7fffffffdfa0 "/home/machin/tests/dvp/coin"}
    (gdb) x/4gx tinfo
    0x60b050:       0x0000000000000000      0x0000000000000000
    0x60b060:       0x0000000000400e5c      0x00007fffffffdfa0
    (gdb) c
    Continuing.
    [New Thread 0x7ffff77f4700 (LWP 9770)]
    (...)
    Breakpoint 1, count_lines (args=0x7fffffffdf40) at pouet.c:25
    25          line = (char*) malloc (sizeof(char));
    (gdb) print args
    $3 = (void *) 0x7fffffffdf40
    (gdb) print tinfo
    $4 = (struct thread_info *) 0x7fffffffdf40
    (gdb) print *tinfo
    $5 = {thread_id = 6336592, thread_num = -8288, file = 0x603010 "\a", current_dir = 0x0}
    (gdb) x/4gx tinfo
    0x7fffffffdf40: 0x000000000060b050      0x00007fffffffdfa0
    0x7fffffffdf50: 0x0000000000603010      0x0000000000000000[/color]
    (gdb) print *(struct thread_info*)*tinfo
    $6 = {thread_id = 140737345701632, thread_num = 0, file = 0x400e5c "contributors.txt", current_dir = 0x7fffffffdfa0 "/home/machin/tests/dvp/coin"}
    c'est limpide (sisi ) le problème est à la ligne 68, tu as déclaré struct thread_info *tinfo; comme étant un pointeur de structure, et tu passes à ton thread l'adresse de ce pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    --- pthread_create(&tinfo->thread_id, &attr, count_lines, &tinfo);
    +++ pthread_create(&tinfo->thread_id, &attr, count_lines, tinfo);
    ce problème là est règlé... mais d'autres suivront
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    line = (char*) malloc (sizeof(char)); // alloue 1 octet

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Quand on lit ceci on peut avoir envie de répondre que l'outil qui compte les retours à la ligne est "wc -l".
    Oh cool, une commande pour verifier que mon programme fonctionne, merci.
    Mais sinon c'est toujours plus fun de coder ses commandes.


    Sinon un grand merci a BufferBob. Je ne connaissais pas le flag -ggdb pour le compilo, ca va servir pour les prochaines fois.
    Ta trace GDB est vraiment claire, va falloir que je lise plus de choses dessus, etant donne que je debute.

    Je te remercie aussi pour la ligne d'apres avec l'allocation de ligne, ca faisait planter le programme pour mes autres tests. Je vais pouvoir fermer le topic.

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

Discussions similaires

  1. Passage d'arguments à un thread
    Par flo_k dans le forum Windows
    Réponses: 3
    Dernier message: 09/06/2008, 20h12
  2. Passage d'argument à un thread
    Par crunk dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 02/08/2007, 17h12
  3. Probleme de passage d'arguments dans un thread
    Par TheBAT dans le forum POSIX
    Réponses: 4
    Dernier message: 05/02/2007, 19h58
  4. Passage d'argument à un thread avec _Beginthreadex
    Par likenoother dans le forum MFC
    Réponses: 4
    Dernier message: 13/09/2006, 10h02
  5. Problème de passage d'argument a un thread
    Par goof_22 dans le forum SDL
    Réponses: 2
    Dernier message: 19/04/2006, 17h59

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