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 :

erreur de segmentation


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 53
    Points : 16
    Points
    16
    Par défaut erreur de segmentation
    Salut à tous,
    Mon algorithme en c++ compile bien mais lors de l exécution il me gènére une erreur de segmentation. est ce que quelqu'un a déjà rencontré ce type de message ?
    Merci .

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    A peu près 100% des développeurs C/C++ l'ont déjà vue, cette erreur, t'inquiète pas...

    Tu as dû déréférencer un pointeur non-initialisé, ou taper "trop loin" après une structure ou un container (aller au delà de sa taille). Mais bon, sans le code et la ligne indiquée pour l'erreur, difficile d'être plus précis.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    oui clair qu'entre celle là et les autre memory fault , bus error, ...

    petite aide pour trouver la cause de l'erreur

    http://www.cmi.univ-mrs.fr/~contensi...=env&page=deb5
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Salut,

    L'erreur de segmentation est sans doute une des erreurs les plus courantes à l'exécution.

    Elle survient généralement de manière aléatoire parce que, à un moment, tu essaye d'aller "chipoter" à une adresse mémoire qui n'est plus utilisée dans le contexte où tu essaye d'y accéder.

    Le plus souvent, elle est due:
    • à un pointeur détruit non remis à zéro,
    • à un pointeur NULL non testé,
    • à une tentative d'accès au Nieme élément d'une collection qui n'en contient que maximum N-1,
    • à une tentative d'accès à un objet pointé par un pointeur qui n'a pas été correctement initialisé (à NULL s'il pointe vers un objet inexistant ou à une valeur correspondant réellement à l'adresse à laquelle se trouve un objet du type adéquat).
    Comme tu peux le remarquer, son origine est très souvent un pointeur

    Mais, au delà de cela, il faudrait au moins une partie du code pour arriver à en déterminer la cause.

    Le plus embêtant de l'histoire, c'est que l'erreur qui finit par provoquer la faute de segmentation est parfois très éloignée du point où elle apparait
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 53
    Points : 16
    Points
    16
    Par défaut
    Merci pour vos réponses, je vais revoir tous les pointeurs de mon code et les containers, et essayer la solution de jabbounet. sinon j envoyerai mon code.

  6. #6
    Membre habitué

    Inscrit en
    Mai 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 132
    Points : 171
    Points
    171
    Par défaut
    Salut,

    bon idee est aussi lancer ton program sous debuger

    (ou bien ... utiliser "memory checker" comme valgrind etc. mais c'est plus difficile et c'est la solution seulement pour linux).

    Fredy

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 53
    Points : 16
    Points
    16
    Par défaut
    j'ai lancé mon programme avec gdb comme suit :
    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
    anne@anne-desktop:~/Bureau/paradiseo-1.2.1/paradiseo-eo/build/tutorial/FeatureSelection2$ gdb ./FeatureSelectionEA 
    GNU gdb 6.6-debian
    Copyright (C) 2006 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "i486-linux-gnu"...
    Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
    (gdb) run
    Starting program: /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build/tutorial/FeatureSelection2/FeatureSelectionEA 
    Loading model from file ...
    No such file or directory
     
    Program exited with code 01.
    (gdb) run
    Starting program: /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build/tutorial/FeatureSelection2/FeatureSelectionEA 
    Loading model from file ...
    No such file or directory
     
    Program exited with code 01.
    je ne sais pas j'arrive toujours pas à cerner l erreur?
    Fredy Kruger est ce que vous pouvez m'expliquer svp comment je peux utiliser "memory checker parce que je suis sous lunix? Merci

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 53
    Points : 16
    Points
    16
    Par défaut
    voilà je vous envoie les classes dont je suis sure que l'erreur vient de l'une d'elle.
    est ce que quelqu'un peut m'aider?
    Fichiers attachés Fichiers attachés

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Je n'ai pas tout analysé mais il y au - un truc qui me parait bizarre et qui pourrait expliquer ton problème (ou un futur problème).
    Dans eoFeatureSelectionClone.h, dans la fonction void apply(eoPopulator<GenotypeT>&_pop) , tu écris :
    Puis ta boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (j!=100)
       {
          // ....
          for(unsigned i=0;i<=10;i++)
       }
    Tu fais donc 1100 itérations si je ne m'abuses. Ne serait-ce pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (j!=100)
       {
          // ....
          for(unsigned i=0;i<10;i++)
       }

  10. #10
    Membre habitué

    Inscrit en
    Mai 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 132
    Points : 171
    Points
    171
    Par défaut
    Salut,

    1. Ca c'est quoi ?

    Starting program: /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build/tutorial/FeatureSelection2/FeatureSelectionEA
    Loading model from file ...
    No such file or directory

    ?????

    2. Valgrind
    Il faut le telecharger de http://valgrind.org/ et apres lancer "la Sainte Trinité" .... c'est-à-dire

    configure ; make ; make install

    Moi, je lance valgrind comme ca :

    valgrind --leak-check=full --show-reachable=yes --log-file=resultat_in_txt.txt ./binary_a_lancer


    Bonne chance. Fredy

    ( et excusez ma langue francaise )

  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 53
    Points : 16
    Points
    16
    Par défaut
    merci 3DArchi c vrai c'est l'une des erreurs que je mes suis pas rendu compte d eux! en fait c'est un algorithme évolutionnaire qui crée pour chaque individu dix copies, et comme une population comporte 100 individus on va obtenir 1000! et c vrai que ≤ est fausse!
    mais ça n empeche le problème d erreur de segmentation persiste encore

    merci fredy! je vais essayer ce que vous m'aviez proposé!

  12. #12
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Pour gdb :
    compile avec -g;
    essaye insight ou ddd, moins galère à utiliser au début.

    Ou alors, fais un mode TRACE :
    à chaque début de fonction ou méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifdef TRACE
    std::cout<<"Entré dans fonction"<<std::endl;
    #endif
    et compile avec -D TRACE.

    Ou enfin, plus dure, regarde du coté de la gestion des execptions...
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  13. #13
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 53
    Points : 16
    Points
    16
    Par défaut
    merci lavock! j'ai essayé toutes ces solutions mais aucune ne marchent pour moi.
    pour TRACE j ai fait ce que vous m'avez indiqué mais lorsque je tape make -D TRACE pour compiler cela m 'affiche qu il n y a pas d option de type -D

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Il n'y a pas d'espace entre D et TRACE : -DTRACE

  15. #15
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    L'espace est optionel, c'est surtout que tu ne doit pas l'invoquer sur le make mais sur ton compilateur.

    Modifie ton Makefile est rajoute ceci à la fin de CXXFLAGS ou de ta ligne de compilation.
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  16. #16
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Pour gdb :
    compile avec -g;
    essaye insight ou ddd, moins galère à utiliser au début.

    Ou alors, fais un mode TRACE :
    à chaque début de fonction ou méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifdef TRACE
    std::cout<<"Entré dans fonction"<<std::endl;
    #endif
    et compile avec -D TRACE.

    Ou enfin, plus dure, regarde du coté de la gestion des execptions...
    Comment peut on conseiller de débuger en mode trace ? Ton message devrait s'arrêter à GDB
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  17. #17
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Comment peut on conseiller de débuger en mode trace ? Ton message devrait s'arrêter à GDB
    Parce que, si je ne m'abuse, la question à été posé par quelqu'un qui ne maîtrise pas encore tout bien. Et le mode trace apporte, pédagogiquement, un intérêt bien plus subtile que le debug (qui de plus s'avère relativement dur à maîtriser pour les débutants).

    Mais dans l'ensemble, je suis bien d'accord, une fois GDB maîtriser, le trace est à bannir !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  18. #18
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Parce que, si je ne m'abuse, la question à été posé par quelqu'un qui ne maîtrise pas encore tout bien. Et le mode trace apporte, pédagogiquement, un intérêt bien plus subtile que le debug (qui de plus s'avère relativement dur à maîtriser pour les débutants).

    Mais dans l'ensemble, je suis bien d'accord, une fois GDB maîtriser, le trace est à bannir !
    ça apprend a mettre des printf partout dans le code encadré par des directives de compilation....
    bref ça peu réduire a lisibilité du code.

    pour le débugger pas besoin de le maitriser complètement pour savoir ou ça plante.
    Avec un programme compilé et linké avec l'option -g
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $ulimit -c unlimited
    $./monprogrammme_qui_plante ....
      --> genère un fichier core. 
    $gdb monprogrammme_qui_plante   <le fichier core genéré précédement>
    et une fois dans le debugger tu tappe la commande "bt" pour avoir la pile d'appel et donc la méthode ou ça plante ainsi que la ligne.
    tu as aussi ses appelant qui sont parfois fautif aussi de fournir des paramètres invalide.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  19. #19
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Non, c'est surtout que ça montre de façon rudimentaire et précise comment les appels s'enchaine.

    A vrai dire, je ne connaissait pas trop ulimit (vite fait le nom). La question est :
    Crois tu vraiment que quelqu'un qui ne maîtrise pas le compilateur (et qui vient surement d'un autre langage style java), arrivera à exploiter le résultat de la commande bt ?

    Quoi qu'il en soit, annesophiedecar, pourrais tu, s'il de plait, nous écrire ton Makefile pour qu'on te dise quoi mettre dedans, et ainsi être complet ?
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  20. #20
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    A vrai dire, je ne connaissait pas trop ulimit
    c'est juste pour indiquer que le système peu pondre des fichiers coredump (pour faire des debug post mortem)
    je l'ai indiqué au cas ou le compte est configuré par défaut pour ne pas en générer.

    Cette commande est parfois utile, car elle peu gérer quelques limites sur les compte utilisateurs (nombre de descripteurs de fichier ouvert simultanément par exemple)

    Citation Envoyé par Lavock Voir le message
    Non, c'est surtout que ça montre de façon rudimentaire et précise comment les appels s'enchaine.

    A vrai dire, je ne connaissait pas trop ulimit (vite fait le nom). La question est :
    Crois tu vraiment que quelqu'un qui ne maîtrise pas le compilateur (et qui vient surement d'un autre langage style java), arrivera à exploiter le résultat de la commande bt ?

    Quoi qu'il en soit, annesophiedecar, pourrais tu, s'il de plait, nous écrire ton Makefile pour qu'on te dise quoi mettre dedans, et ainsi être complet ?
    oui je pense.

    si l'option -g est positionnée à la compilation, tu as la liste des fonctions qui ont été appelées au moment du plantage ainsi que la ligne dans le fichier source.
    il suffit ensuite d'aller dans les fichiers pour regarder.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 12h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 19h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 14h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 15h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 12h18

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