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 :

Chasser l'erreur de segmentation


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Janvier 2007
    Messages : 29
    Par défaut Chasser l'erreur de segmentation
    Bonjour à tous !

    J'ai écrit un programme de recherche de chemin (avec A* dedans), compilé avec gcc.
    Je lance (dans un but statistique) la fonction une trentaine de fois dans le programme.
    Dans la plupart des cas, une erreur de segmentation apparaît avant le trentième essai, mais comme elle peut se produire n'importe quand, si je cherche la ligne qui la cause en passant ligne après ligne dans GDB, je vais y passer des heures.
    Y a-t-il un moyen (avec GDB ou autre) de savoir à quelle ligne se produit l'erreur ?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Normalement quand ça crashe GDB stoppe et t'indique la ligne courante. Après tu peux consulter la pile d'appels avec l'option backtrace, la valeur des variables, etc...

  3. #3
    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
    Par défaut
    Si tu lances ton programme compilé en mode debug avec valgrind tu devrais avoir toutes les informations voulues au moment où ça segfaulte.

  4. #4
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Janvier 2007
    Messages : 29
    Par défaut
    Merci pour vos réponses.

    Je fais tourner mon programme à partir de gdb et obtiens la sortie
    suivante (EK_Noeud est une de mes classes):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    (gdb) run
    Starting program: ~/TRAVAIL/2006-2007TIPE/PathFinder 
    [Thread debugging using libthread_db enabled]
    [New Thread 805458416 (LWP 12492)]
    [...Sortie standard de mon programme...]
    Program received signal SIGSEGV, Segmentation fault.
    [Switching to Thread 805458416 (LWP 12492)]
    0x10006204 in __gnu_cxx::new_allocator<EK_Noeud>::construct (this=0x7fda959f, __p=0x1003b370, 
        __val=@0xf)
        at /usr/lib/gcc/powerpc-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:104
    (gdb) 
    Debugger finished
    Comme ce programme utilise tout l'écran je ne peux ni voir le
    débuggeur tourner (et comme il tourne dans emacs, cela me permettrait
    de voir de code en même temps) ni contrôler le débuggeur.
    Lors de l'arrêt du programme, il reste figé sur ce qu'il présentait à
    l'écran au moment de mourir. Je suis obligé d'aller sur le tty1 pour
    faire un $killall gdb (tuer mon programme ne fonctionne pas, il est
    déjà mort, mais apparait quand je fais $ps -A) afin de
    pouvoir récupérer la main.

    La ligne correspondant à l'arrêt du programme est selon emacs, située
    dans le fichier new_allocator.h, je l'ai
    marquée d'un ==> :
    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
     
    // Allocator that wraps operator new -*- C++ -*-
    [...]
    // This file is part of the GNU ISO C++ Library.  This library is free
    [...]
    /** @file ext/new_allocator.h
     *  This file is a GNU extension to the Standard C++ Library.
     */
     
    #ifndef _NEW_ALLOCATOR_H
    #define _NEW_ALLOCATOR_H 1
     
    #include <new>
    #include <bits/functexcept.h>
     
    namespace __gnu_cxx
    {
      /**
       *  @brief  An allocator that uses global new, as per [20.4].
       *
       *  This is precisely the allocator defined in the C++ Standard. 
       *    - all allocation calls operator new
       *    - all deallocation calls operator delete
       */
      [...]
      // _GLIbCXX_RESOLVE_LIB_DEFECT
      // 402. wrong new expression in [some_] allocator::construct
      void	
     ==> construct(pointer __p, const _Tp& __val) 
          { ::new(__p) _Tp(__val); }
          void 
          destroy(pointer __p) { __p->~_Tp(); }
        };
    [...]
     
    #endif
    Cela ne m'avance pas beaucoup : comme je ne peux faire un backtrace,
    je ne sais pas où est l'appel qui provoque la catastrophe.

    Il est sans doute possible de faire tourner mon programme dans une
    fenêtre, mais j'aimerais, avant de modifier le code en ce sens, savoir
    s'il existe un moyen de voir le débuggeur et emacs plutot que mon
    programme (qui utilise la DSL) lorsque celui-ci tourne.

  5. #5
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Janvier 2007
    Messages : 29
    Par défaut
    J'ai modifié le programme, pour qu'il tourne dans une fenêtre (une constante à changer, c'est vraiment bien foutu, la SDL) et grâce à backtrace j'ai trouvé l'appel qui provoque le crash.

    Merci beaucoup

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

Discussions similaires

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

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