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 (core dumped) sous linux mais pas windows


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2004
    Messages : 114
    Points : 43
    Points
    43
    Par défaut Erreur de segmentation (core dumped) sous linux mais pas windows
    Bonjour,

    Je viens pour vous faire part d'un problème urgent, ayant fini mon projet, j'ai souhaité le tester sous Linux qui est l'environnement de développement par défaut.

    Tout compile parfaitement bien sous windows mais sous linux, j'ai le droit d'avoir une belle erreur de segmentation (core dumped)

    Cela surviendrait à l'appel de cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Recette::recupSousRecette(string_double_map& ingredients,pile_string& instructions,Ingredient* i, Quantite* q, double facteur) const;
    Cette méthode est censée modifier la structure string_double_map et pile_string qui sont des variables locales à la fonction appelante.

    D'où pourrait venir le problème ?

    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Un erreur de segmentation vient toujours d'un accès mémoire à un endroit non alloué.
    Ton bug existe probablement sous Windows, néanmoins invoquer un comportement indéfini ne fait pas nécessairement planter le programme.

    Utilise le débogueur valgrind, avec ça tu devrais trouver les erreurs très rapidement.
    Boost ftw

  3. #3
    Membre du Club
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2004
    Messages : 114
    Points : 43
    Points
    43
    Par défaut
    Merci de ta réponse, nous n'avons pas l'outil à notre disposition pour le moment.

    On a testé gdb qui nous retourne l'erreur suivante

    Program received signal SIGSEGV, Segmentation fault.
    0xb7ef57c9 in __dynamic_cast () from /usr/lib/libstdc++.so.6
    Nous avons donc identifié le problème dans cette portion de code.

    L'ingrédient passé lors de l'appel est une matière (Ingredient est la classe mere de Matière) !

    L'erreur se fait sur le dynamic_cast pour matière. Voici le code :


    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
    void Recette::recupSousRecette(string_double_map& ingredients,pile_string& instructions,Ingredient* i, Quantite* q, double facteur) const {
    
    
        ingredient_quantite_map::iterator it;
        string_double_map::iterator iter;
    
        Recette* r ;
        Matiere* m ;
        string sTmp;
    cout << "recup :" ;
    i->afficher(cout);
    
        m =  dynamic_cast<Matiere*>(i);
        if(m!=0) {
    cout << "dedans";
            // On verifie si elle existe deja
    
            sTmp = q->unite()+" "+i->getNom();
            iter = ingredients.find(sTmp);
            if( iter != ingredients.end() ) {
                iter->second += facteur*q->nombre();
            }
            else {
                ingredients.insert(make_pair(sTmp,facteur*q->nombre()));
            }
        }
    
        r =  dynamic_cast<Recette*>(i);
        if(r!=0) {
            facteur *= (q->nombre()/((r->getQuantite())->nombre()));
            instructions.push(r->getIntruction());
            if( !(r->getMap()).empty() ) {
    
                for (it = (r->getMap()).begin(); it != (r->getMap()).end(); ++it) {
                    recupSousRecette(ingredients,instructions,(*it).first,(*it).second,facteur);
                }
    
    
            }
        }
    
    }
    Nous remarquons lors de l'execution que l'affichage "dedans" n'apparait pas.

    D'où peut venir le problème ?

    Merci encore

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si le pointeur i est invalide mais pas NULL (genre, un objet déjà deleté), ça peut sûrement faire foirer spectaculairement le dynamic_cast...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Merci de ta réponse, nous n'avons pas l'outil à notre disposition pour le moment.
    sudo apt-get install valgrind et ça y est tu l'as, c'est magique linux.
    Boost ftw

  6. #6
    Membre du Club
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2004
    Messages : 114
    Points : 43
    Points
    43
    Par défaut
    Salut, le problème est résolu, il venait de la boucle for traitant sur l'iterrateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     for (it = (r->getMap()).begin(); it != (r->getMap()).end(); ++it) {
    En effet r>-getMap() renvoyait ma structure de map mais un conflit devait exister entre le begin et le end.

    Merci de votre aide

  7. #7
    screetch
    Invité(e)
    Par défaut
    getMap() renvoie peut etre une copie du map au lieu de renvoyer une reference... du coup le begin de la premiere copie ne correspond pas au end de la seconde copie.

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

Discussions similaires

  1. Erreur de segmentation (core dumped)
    Par yansei dans le forum C
    Réponses: 13
    Dernier message: 07/06/2008, 11h51
  2. Erreur de segmentation (core dumped)
    Par benja507 dans le forum Débuter
    Réponses: 11
    Dernier message: 14/05/2008, 17h37
  3. Erreur de segmentation (core dumped)
    Par mansour67 dans le forum wxWidgets
    Réponses: 3
    Dernier message: 05/03/2008, 18h11
  4. erreur de segmentation core dumped
    Par panganino dans le forum Langage
    Réponses: 2
    Dernier message: 03/01/2008, 12h45
  5. Réponses: 5
    Dernier message: 04/11/2007, 13h39

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