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 :

Rapport de debogage valgrind


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut Rapport de debogage valgrind
    Bonsoir à tous,

    J'ai un petit soucis avec le rapport de débogage de valgrind, a vrai dire je ne le comprend pas bien ...

    Je vais commencer par vous mettre le rapport

    ==6458==
    ==6458== Conditional jump or move depends on uninitialised value(s)
    ==6458== at 0x804B12E: del_client (in /home/serveur/S-Inspire/sinspire)
    ==6458== by 0x804B17F: free_clients (in /home/serveur/S-Inspire/sinspire)
    ==6458== by 0x405B6E7: (within /lib/i686/cmov/libc-2.7.so)
    ==6458== by 0x804B56D: main (in /home/serveur/S-Inspire/sinspire)
    ==6458==
    ==6458== Invalid read of size 4
    ==6458== at 0x804B180: free_clients (in /home/serveur/S-Inspire/sinspire)
    ==6458== by 0x405B6E7: (within /lib/i686/cmov/libc-2.7.so)
    ==6458== by 0x804B56D: main (in /home/serveur/S-Inspire/sinspire)
    ==6458== Address 0x418f47c is 244 bytes inside a block of size 248 free'd
    ==6458== at 0x4022B8A: free (vg_replace_malloc.c:323)
    ==6458== by 0x804B17F: free_clients (in /home/serveur/S-Inspire/sinspire)
    ==6458== by 0x405B6E7: (within /lib/i686/cmov/libc-2.7.so)
    ==6458== by 0x804B56D: main (in /home/serveur/S-Inspire/sinspire)
    ERROR: with function recv() [Resource temporarily unavailable]
    ==6458==
    ==6458== ERROR SUMMARY: 7 errors from 3 contexts (suppressed: 71 from 2)
    ==6458== malloc/free: in use at exit: 9,052 bytes in 38 blocks.
    ==6458== malloc/free: 45 allocs, 7 frees, 11,204 bytes allocated.
    ==6458== For counts of detected errors, rerun with: -v
    ==6458== searching for pointers to 38 not-freed blocks.
    ==6458== checked 87,632 bytes.
    ==6458==
    ==6458== LEAK SUMMARY:
    ==6458== definitely lost: 0 bytes in 0 blocks.
    ==6458== possibly lost: 0 bytes in 0 blocks.
    ==6458== still reachable: 9,052 bytes in 38 blocks.
    ==6458== suppressed: 0 bytes in 0 blocks.
    ==6458== Reachable blocks (those to which a pointer was found) are not shown.
    ==6458== To see them, rerun with: --leak-check=full --show-reachable=yes
    et voici les parties qui semblent poser problème

    dans le main
    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
     
    static void
    sig_handler(int signum)
    {
    	switch (signum)
    	{
    		/* Interrupt */
    		case SIGINT:
    		/* Terminated */
    		case SIGTERM:
    			irc_send(":%s SQUIT %s :received SIGINT/SIGTERM - closing link", me.sid, me.name);
    			me.socket.active = 0;
    			remove(pid_file);
    			free_clients(); // < ---- ICI ----
    			//free_commands();
    			//free_users();
    			break;
    		/* Hangup */
    		case SIGHUP:
    			fprintf(stderr, "SIGHUP - reload config file\n");
    			break;
    		default:
    			/* log others signals */
    			fprintf(stderr, "Received signal [%d] - %s", signum, sys_siglist[signum]);
    			break;
    	}
    }
    le fichier clients.c

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    #include "infos.h"
     
     
    static t_client *clientlist = NULL;
     
     
    t_client
    *add_client(const char *sid, const char *uid, const char *nick,
                       const char *user, const char *host, const char *signon)
    {
    	t_client *cptr = malloc(sizeof(*cptr));
     
    	if (!cptr) return NULL;
     
    	string_copy(cptr->sid, sid, SIDLEN);
    	string_copy(cptr->uid, uid, UIDLEN);
    	string_copy(cptr->nick, nick, NICKLEN);
    	string_copy(cptr->user, user, USERLEN);
    	string_copy(cptr->host, host, HOSTLEN);
     
    	cptr->prev = NULL;
    	cptr->next = clientlist;
     
    	if (cptr->next)
    		cptr->next->prev = cptr;
     
    	clientlist = cptr;
    	return cptr;
    }
     
     
    t_client
    *find_client_uid(const char *uid)
    {
    	t_client *cptr = clientlist;
    	for (; cptr && strcasecmp(cptr->uid, uid); cptr = cptr->next);
    	return cptr;
    }
     
     
    t_client
    *find_client_nick(const char *nick)
    {
    	t_client *cptr = clientlist;
    	for (; cptr && strcasecmp(cptr->nick, nick); cptr = cptr->next);
    	return cptr;
    }
     
     
    void
    del_client(t_client *cptr)
    {
    	if (cptr)
    	{
    		//if (do_debug) printf("free client %s [%p]\n", cptr->nick, cptr);
     
    		if (cptr->prev)
    			cptr->prev->next = cptr->next;
    		else clientlist = cptr->next;
     
    		if (cptr->next)
    			cptr->next->prev = cptr->prev;
     
            if (cptr->access) /* remove authentification */
            	cptr->access = NULL;
     
    		free(cptr);
    	}
    }
     
     
    void
    free_clients(void)
    {
    	t_client *cptr = clientlist;
     
    	for (; cptr; cptr = cptr->next) del_client(cptr);
    }
     
     
    int
    authorized(t_client *cptr, const char *comname)
    {
    	t_command *cmptr = find_command(comname);
     
    	if (cptr->access)
    	{
    		if (cptr->access->level >= cmptr->level) return 1;
    	}
    	return 0;
    }
    et la structure client
    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
     
    /********************************************************************
     * Clients struct
     ********************************************************************/
    struct s_client
    {
    	char sid[SIDLEN+1];
    	char uid[UIDLEN+1];
    	char nick[NICKLEN+1];
    	char user[USERLEN+1];
    	char host[HOSTLEN+1];
    	char name[REALLEN+1];
    	unsigned int modes;
    #define UMODE_i 0x0001 /* User cannot be seen in /WHO by non-IRC Ops */
    #define UMODE_w 0x0002 /* User can receive WALLOPS */
    #define UMODE_x 0x0004 /* Masks a users hostname. Disallows others from getting your IP address. */
    #define UMODE_o 0x0008 /* User is an IRC Operator */
    #define UMODE_s 0x0010 /* User can receive server notices. */
    #define UMODE_B 0x0020 /* Marks the user as a Bot. */
    #define UMODE_R 0x0040 /* User can only receive PRIVMSGs from registered (+r) users. */
    #define UMODE_r 0x0080 /* Marks a user as "registered and identified" from Services. */
    	time_t signon;
     
    	t_user *access;
    	t_client *prev, *next;
    };
    Il n'y a pas de plantage du programme mais les 7 erreurs qu'il me trouve me tracasse un peu.
    Je sollicite une nouvelle fois votre aide ...

    Merci à vous

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2006
    Messages : 107
    Par défaut
    Une première chose serait de compiler ton programme avec l'option -g de gcc afin d'avoir les informations de deboggage.

    Après valgrind t'indiquera la ligne exacte où il détecte un éventuel problème.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut
    salut,

    Le programme est déja compilé avec l'option -g.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2006
    Messages : 107
    Par défaut
    Bizarre...
    le programme créé n'est pas "strippé" après ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void fonction_fin(void){
    	int i;
    	if (i) {
    		printf(" i !\n");
    	}
    }
    - Sans les infos de débuggage :
    gcc -Wall -o test1 test1.c
    valgrind ./test1
    Donne :
    ==4718== Conditional jump or move depends on uninitialised value(s)
    ==4718== at 0x80483AE: fonction_fin (in /home/apesle/Desktop/TESTS/test1)
    ==4718== by 0x80483EB: main (in /home/apesle/Desktop/TESTS/test1)

    - Avec :
    gcc -Wall -g -o test1 test1.c
    valgrind ./test1
    ==4732== Conditional jump or move depends on uninitialised value(s)
    ==4732== at 0x80483AE: fonction_fin (test1.c:16)
    ==4732== by 0x80483EB: main (test1.c:25)

  5. #5
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Citation Envoyé par Ganondorf Voir le message
    Bonsoir à tous,
    ==6458== Address 0x418f47c is 244 bytes inside a block of size 248 free'd
    Or
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void free_clients(void) 
    {
    	t_client *cptr = clientlist; 
    	for (; cptr; cptr = cptr->next) del_client(cptr);
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void del_client(t_client *cptr)
        [...]
        free(cptr);
    Donc on peut déréférencer (cptr=cptr->next) une structure désallouée (free(cptr)).
    Et c'est bien ce que dit valgrind, que tu accède au déplacement 244 d'une structure de 248 octets qui vient d'être libérée, et en regardant la définition d'un client, on a bien next, qui est à un pointeur (donc 4 octets en 32bits) de la fin de la structure.
    Il faut changer le code de free_clients, genre comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void free_clients(void)
    {
         t_client *cptr, *next;
         for (cptr = clientlist; cptr; cptr = next) {
            next = cptr->next;
            del_client(cptr);
         }
    }
    L'indentation de ton code est trompeuse (mix de tabs et d'espaces...)

    Après, je ne sais pas si sig_handler() est bien défini comme handler de signal, mais il ne faut pas appeler de fonction non signal-safe (cf. man 7 signal), comme par exemple free() (tu peux effectivement très bien prendre ton signal alors que tu es dans un free() et rappeler free() n'est pas supporté). Il vaut mieux dans le handler juste noter que tu as reçu un signal, et faire le traitement dans ta boucle principale.

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut
    salut,

    désolé du retard ... comme un gros naze je n'avais pas mit l'option -g dans tout mes Makefile ... J'ai réussi a corriger les erreurs grâce aux numéro de lignes, le problème est donc réglé merci à vous.

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

Discussions similaires

  1. [éditeur de rapport]section
    Par Stessy dans le forum PowerAMC
    Réponses: 11
    Dernier message: 28/03/2003, 12h36
  2. Page de rapport de bug sur le site de Sun
    Par piff dans le forum Général Java
    Réponses: 1
    Dernier message: 03/03/2003, 18h12
  3. Les possibilité que C++ offre par rapport à Pascal Objet
    Par Riko dans le forum Langages de programmation
    Réponses: 13
    Dernier message: 01/02/2003, 21h38
  4. Print et Preview d'un rapport Rave
    Par joebarthib dans le forum Rave
    Réponses: 4
    Dernier message: 19/12/2002, 14h46
  5. [Choix] Quelles attentes par rapport aux SGBD ?
    Par thierry34 dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 13/07/2002, 20h08

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