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 :

Localiser précisément un dépassement de mémoire


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut Localiser précisément un dépassement de mémoire
    Hello!

    Bon voila, j'ai en ce moment le genre de problème un peu mystérieux pour moi, enfin en tout cas difficile a régler. Récemment j'ai posté un sujet similaire, sauf que l'erreur s'est en fait révélée assez bidon...

    Bref mon problème en ce moment est que je doit avoir dans mon programme une erreur qui aboutit a la lecture ou a l'écriture dans des endroits de la mémoire ou j'ai pas le droit, et un segfault apparait donc naturellement a divers moments..

    Ma question est simple: y'a t-il un moyen de stopper le programme, ou de signaler l'instruction exacte, au moment précis ou il y a un quelconque dépassement?

    ----

    Je décrit brièvement le comportement quand même, le but étant simplement de bien poser problème et non que vous m'aidiez a débugger (le programme étant trop long, et je n'ai pour le moment aucune idée de l'endroit qui peut poser problème). Ma fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void write_pdb_atoms(FILE *f, s_atm *atoms, int natoms) 
    {
    	s_atm *atom = NULL ;
    	int i ;
    	for(i = 0 ; i < natoms ; i++) {
    		atom = atoms + i ;
    		fprintf(stdout, ">> Atom %p: %d vs %d\n", atom, i, natoms) ; fflush(stdout) ;
                    fprintf(stdout, "%s %d \n", atom->type, atom->id) ;
     
    		write_pdb_atom_line(f, atom->type, atom->id);
    	}
    }
    En gros, si je met le deuxième fprintf en commentaire, j'ai droit a un segfault avec l'affisage suivant (gdb):
    (...)
    >> Atom 0x81329c8: 1738 vs 2973
    >> Atom 0x36333830: 14388 vs 2973 // Notez que la valeur de i change complètement... de 1738 a 14388
    Program received signal SIGSEGV, Segmentation fault.
    write_pdb_atoms (f=0x80d6088, atoms=0x810d458, natoms=2973) at src/writepdb.c:106
    106 write_pdb_atom_line(f, atom->type, atom->id)
    (gdb) where
    #0 write_pdb_atoms (f=0x80d6088, atoms=0x810d458, natoms=2973) at src/writepdb.c:106
    Si en revanche j'execute bien le deuxième affichage, pas de soucis, pas de segfault...

    Merci d'avance

  2. #2
    Membre régulier
    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
    Points : 124
    Points
    124
    Par défaut
    tu peux utiliser valgrind, il est parfait pour trouver les failles mémoires.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    valgrind --leak-check=yes ./tonprog

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    A mon avis sur cet ligne ton compilateur dois te signaler une erreur déjà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(stdout, ">> Atom %p: %d vs %d\n", atom, i, natoms)
    T'essayes d'écrire des entiers alors que tu donne des pointeurs sur ta structure s_atome.

    Heu arretez moi si jdis une connerie

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Citation Envoyé par apesle Voir le message
    tu peux utiliser valgrind, il est parfait pour trouver les failles mémoires.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    valgrind --leak-check=yes ./tonprog
    Allons-y alors...

    @raf: Le format %p permet d'afficher une adresse donc pas de problème là dessu.

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    et sinon si tu es sur unixoide ddd

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Tu peux également utiliser la bibliothèque Electric Fence qui place chaque zone mémoire allouée par malloc() directement avant une page mémoire inaccessible. De cette manière, la faute de segmentation intervient au premier débordement et l'erreur est ainsi plus facile à localiser. Par exemple, le débordement de tableau observé dans le code ci-dessous n'est (chez moi) pas suffisant pour entraîner une erreur de segmentation:

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
        int *p = NULL;
     
        p = malloc(10 * sizeof *p);
        if (p != NULL)
        {
            int i;
     
            /* -tc- ATTENTION: ce code est (volontairement) faux. Debordement
                de tableau*/
            for (i = 0; i < 30; i++)
            {
                p[i] = i;
            }
     
            for (i = 0; i < 30; i++)
            {
                printf("%d ", p[i]);
            }
            printf("\n");
        }
     
        return 0;
    }
    Lorsque que je lie Electric Fence au projet (avec -lefence) l'erreur de segmentation intervient immédiatement dès que j'essaie d'accéder à p[10]. Il est dès lors facile, à l'aide de gdb, de localiser la ligne exacte responsable de l'erreur de segmentation.

    Thierry

  7. #7
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Trés bien ca! J'ai réussi a régler mon problème avec valgrind, même sic 'était pas évident, un bon nombre d'erreur que je ne comprenais pas trop (des histoires variables non initialisées notamment...).

    Bref je vais regarder cet outil également qui me semble plutôt pas mal. MErci bien!

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 13/11/2008, 23h15
  2. Dépassement de mémoire pour liste liées
    Par jpascal dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/04/2008, 21h37
  3. Re: dépassement de mémoire
    Par petdelascar dans le forum C
    Réponses: 8
    Dernier message: 05/12/2005, 22h17
  4. dépassement de mémoire
    Par petdelascar dans le forum C
    Réponses: 5
    Dernier message: 05/12/2005, 15h13
  5. Qu'est-ce que "le dépassement de mémoire tampon"
    Par allex2108 dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 13/09/2005, 14h33

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