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

Distributions Discussion :

Besoin d'aide sur un message d'erreur


Sujet :

Distributions

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 17
    Points
    17
    Par défaut Besoin d'aide sur un message d'erreur
    Bonjour a tous,

    J'essaie d'implementer un algorithme de tri sur mon ordinateur linux. J'ai un message d'erreur que je ne comprends pas. Je le poste sur le forum linux car mon algorithme a l'air de fonctionner : il ne trie pas mais la fonction de tri quitte normalememt sans erreur, la premiere ligne est issu d'un printf invoque apres ma fonction de tri:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void	ft_test_libqsort(void	*tab, int n)
    {
    	int	*tab2;
    	clock_t	start, end;
     
    	tab2 = malloc(n * sizeof(int));
    	memcpy(tab2, tab, n * sizeof(int));
    	start = clock();
    	mysort(tab2, n, sizeof(int), f_cmp_int);
    	end = clock();
    	printf("time libqsort  : %.2f", (end - start)/(double)CLOCKS_PER_SEC);
    	ft_check_result(tab2, n);
    	free(tab2);
    }
    Lorsque j'execute le binaire, j'obtiens le message suivant ? Pouvez m'eclairer quant a la signification de ce message ? Merci d'avance.

    time quicksort : 0.00-------NOT SORTED---------
    *** Error in `./a.out': double free or corruption (out): 0x0000000001710030 ***
    ======= Backtrace: =========
    /lib/x86_64-linux-gnu/libc.so.6(+0x80996)[0x7f86b1122996]
    ./a.out[0x400a4c]
    ./a.out[0x400b6f]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7f86b10c3de5]
    ./a.out[0x400799]
    ======= Memory map: ========
    00400000-00402000 r-xp 00000000 08:01 4983886 /home/gautier/etude/sorting_algo/a.out
    00601000-00602000 r--p 00001000 08:01 4983886 /home/gautier/etude/sorting_algo/a.out
    00602000-00603000 rw-p 00002000 08:01 4983886 /home/gautier/etude/sorting_algo/a.out
    01710000-01731000 rw-p 00000000 00:00 0 [heap]
    7f86b0e8c000-7f86b0ea1000 r-xp 00000000 08:01 1703941 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f86b0ea1000-7f86b10a0000 ---p 00015000 08:01 1703941 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f86b10a0000-7f86b10a1000 r--p 00014000 08:01 1703941 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f86b10a1000-7f86b10a2000 rw-p 00015000 08:01 1703941 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f86b10a2000-7f86b125f000 r-xp 00000000 08:01 1707870 /lib/x86_64-linux-gnu/libc-2.17.so
    7f86b125f000-7f86b145f000 ---p 001bd000 08:01 1707870 /lib/x86_64-linux-gnu/libc-2.17.so
    7f86b145f000-7f86b1463000 r--p 001bd000 08:01 1707870 /lib/x86_64-linux-gnu/libc-2.17.so
    7f86b1463000-7f86b1465000 rw-p 001c1000 08:01 1707870 /lib/x86_64-linux-gnu/libc-2.17.so
    7f86b1465000-7f86b146a000 rw-p 00000000 00:00 0
    7f86b146a000-7f86b148d000 r-xp 00000000 08:01 1707846 /lib/x86_64-linux-gnu/ld-2.17.so
    7f86b166b000-7f86b166e000 rw-p 00000000 00:00 0
    7f86b1688000-7f86b168c000 rw-p 00000000 00:00 0
    7f86b168c000-7f86b168d000 r--p 00022000 08:01 1707846 /lib/x86_64-linux-gnu/ld-2.17.so
    7f86b168d000-7f86b168f000 rw-p 00023000 08:01 1707846 /lib/x86_64-linux-gnu/ld-2.17.so
    7fffadcd0000-7fffadcf1000 rw-p 00000000 00:00 0 [stack]
    7fffadda8000-7fffaddaa000 r-xp 00000000 00:00 0 [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
    Aborted (core dumped)

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    L'erreur indique que vous avez un problème avec votre gestion de la mémoire (soit, car vous faites deux fois un free de la même zone mémoire (du même pointeur), soit vous faites une corruption de la mémoire (écriture hors du tableau ou autre)).
    Pour trouver l'erreur plus en détaille, vous pouvez utiliser gdb et/ou valgrind.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Merci pour votre reponse !

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Pour être sur que je comprends bien :

    J'essaye dans mon programme d'accéder à une zone mémoire à laquelle je n'ai pas le droit. Comparable à ce que l'on fait en executant le main suivant :

    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
     
    #include <stdio.h>
     
    set(char *str)
    {
         while (*str)
        {
            *str = '$';
            str++;
        }
    }
     
    main()
    {
        char dol[15];
     
            set(dol);
        printf(*******************"\n");
        printf(dol);
        printf("\n*******************\n");
    }
    Si l'espace mémoire suivant celui alloué par le malloc (qui doit se trouver sur la stack, c'est ça ?) est rempli de 0, mon programme ne fera pas de segfault. Je pourrais alors obtenir le message suivant si je le lance sur le meme ordinateur (x86_64, linux, etc) :

    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
     
    ******************
      $$$$$$$$$$$$$$$
    ******************
    *** Error in `./a.out': double free or corruption (out): 0x0000000001710030 ***
    ======= Backtrace: =========
    /lib/x86_64-linux-gnu/libc.so.6(+0x80996)[0x7f86b1122996]
    ./a.out[0x400a4c]
    ./a.out[0x400b6f]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7f86b10c3de5]
    ./a.out[0x400799]
    ======= Memory map: ========
    00400000-00402000 r-xp 00000000 08:01 4983886 /home/gautier/etude/sorting_algo/a.out
    00601000-00602000 r--p 00001000 08:01 4983886 /home/gautier/etude/sorting_algo/a.out
    00602000-00603000 rw-p 00002000 08:01 4983886 /home/gautier/etude/sorting_algo/a.out
    01710000-01731000 rw-p 00000000 00:00 0 [heap]
    7f86b0e8c000-7f86b0ea1000 r-xp 00000000 08:01 1703941 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f86b0ea1000-7f86b10a0000 ---p 00015000 08:01 1703941 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f86b10a0000-7f86b10a1000 r--p 00014000 08:01 1703941 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f86b10a1000-7f86b10a2000 rw-p 00015000 08:01 1703941 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f86b10a2000-7f86b125f000 r-xp 00000000 08:01 1707870 /lib/x86_64-linux-gnu/libc-2.17.so
    7f86b125f000-7f86b145f000 ---p 001bd000 08:01 1707870 /lib/x86_64-linux-gnu/libc-2.17.so
    7f86b145f000-7f86b1463000 r--p 001bd000 08:01 1707870 /lib/x86_64-linux-gnu/libc-2.17.so
    7f86b1463000-7f86b1465000 rw-p 001c1000 08:01 1707870 /lib/x86_64-linux-gnu/libc-2.17.so
    7f86b1465000-7f86b146a000 rw-p 00000000 00:00 0 
    7f86b146a000-7f86b148d000 r-xp 00000000 08:01 1707846 /lib/x86_64-linux-gnu/ld-2.17.so
    7f86b166b000-7f86b166e000 rw-p 00000000 00:00 0 
    7f86b1688000-7f86b168c000 rw-p 00000000 00:00 0 
    7f86b168c000-7f86b168d000 r--p 00022000 08:01 1707846 /lib/x86_64-linux-gnu/ld-2.17.so
    7f86b168d000-7f86b168f000 rw-p 00023000 08:01 1707846 /lib/x86_64-linux-gnu/ld-2.17.so
    7fffadcd0000-7fffadcf1000 rw-p 00000000 00:00 0 [stack]
    7fffadda8000-7fffaddaa000 r-xp 00000000 00:00 0 [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
    Aborted (core dumped)
    Les dollars montrent que le main s'est exécuté en entier, les messages Backtrace et Memory map sont des messages d'avertissement de linux (il fait un core dump).

    En revanche, si l'espace suivant le malloc ne commence pas par un 0, la boucle 'while (*str);' la fonction set essayera d'écrire sur cette zone mémoire, segfault.

    C'est ça ?

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Le fait d'accéder à des éléments hors de la mémoire alloué n'entraine pas obligatoirement de segfault (cela dépend du système, de la bibliothèque C...).
    En réalité, Linux permet un peu de sortir de la mémoire, mais l'erreur sera rapporté lors du free, comme quoi, il y a eu corruption de la mémoire.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Merci LittleWhite !

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

Discussions similaires

  1. aide sur un message d'erreur
    Par kroma23 dans le forum Langage
    Réponses: 2
    Dernier message: 02/04/2012, 11h16
  2. [AC-2003] aide sur le Message d'erreur "Conflit d'écriture"
    Par sassene dans le forum IHM
    Réponses: 1
    Dernier message: 09/07/2010, 16h30
  3. [PHP 5.2] Besoin d'aide sur un formulaire : erreur headers already sent by
    Par Zargos dans le forum Langage
    Réponses: 1
    Dernier message: 21/05/2009, 21h56
  4. Besoin d'aide sur une erreur javascript Uncaught Exception
    Par Jim_Nastiq dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 29/11/2007, 16h11
  5. Besoin d'aide sur erreur sql
    Par stagos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/11/2007, 11h47

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