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 :

Comment résoudre l'erreur de segmentation à l'execution d'un programme sous linux ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut Comment résoudre l'erreur de segmentation à l'execution d'un programme sous linux ?
    Bonjour à tous,

    j'ai créé un programme c++ sous Linux.
    Ce programme compile : g++ -g FLinux.cpp -o acq

    Mais à l'exécution du programme il me mets une erreur de segmentation !!!

    J'ai vu sur le net que je pouvais l'exécuter comme ceci : gdb ./acq

    Mais il me retourne une erreur :
    Program received signal SIGSEGV, Segmentation fault.
    0xb7d3480b in strlen () from /lib/tls/libc.so.6


    Comment peux t'on résoudre cette erreur ?

  2. #2
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Tu peux utiliser, dans gdb, la commande "bt", qui te donnera la pile d'appel, au moment du plantage. Cela devrait t'aider à localiser le problème.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    merci white_tentacle,

    j'ai utilisé cette commande et ça me donne le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    (gdb) bt
    #0  0xb7d3c80b in strlen () from /lib/tls/libc.so.6
    #1  0xb7d10114 in vfprintf () from /lib/tls/libc.so.6
    #2  0xb7d28d8b in vsprintf () from /lib/tls/libc.so.6
    #3  0xb7d1539e in sprintf () from /lib/tls/libc.so.6
    #4  0x080496c2 in Alertes (Trame=0xbfacbc7e "ÿîÝÌ\026°Aÿ") at /home/clement/INI/FLinux_868.cpp:85
    #5  0x0804bb05 in main () at /home/clement/INI/FLinux_868.cpp:371

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #4  0x080496c2 in Alertes (Trame=0xbfacbc7e "ÿîÝÌ\026°Aÿ") at /home/clement/INI/FLinux_868.cpp:85
    A priori, je dirais bien que l'erreur est à la ligne 85 du fichier FLinux_868.cpp .

    La chaîne que tu passes à sprintf est visiblement très mal initialisée...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    Oui merci, j'ai corrigé la ligne 85.

    Mais j'ai une autre erreur maintenant que je n'arrive pas à résoudre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    (gdb) bt
    #0  0xb7e9916b in std::string::compare () from /usr/lib/libstdc++.so.6
    #1  0x0804bea2 in std::operator==<char, std::char_traits<char>, std::allocator<char> > (__lhs=@0x0,
        __rhs=@0xbfd014bc)
        at /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/basic_string.h:2139
    #2  0x080499fa in Alertes (Trame=0xbfd016ae "ÿîÝÌ\026°Aÿ") at /home/clement/INI/FLinux_868.cpp:125
    #3  0x0804bbf5 in main () at /home/clement/INI/FLinux_868.cpp:371
    Cela vient de la ligne 125 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (Params[k] == i->pItem)
    {
    ...
    }
    J'effectue une comparaison entre une chaine de type string d'un vecteur (Params[k]) et une autre chaine qui est une section d'un fichier .ini.

    J'utilise SimpleIni.h pour manipuler les fichiers .ini.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 104
    Billets dans le blog
    146
    Par défaut
    Bonjour,

    Avec gdb, on peut faire des miracles
    ( Pardon pour la phrase débile )

    Dans la ligne de code que vous nous montrez ( et où gdb s'arrête ) deux possibilité pour une erreur de segmentation:

    k est un indice qui est plus grand que la taille du tableau
    i n'est pas un pointeur sur un objet valide

    Avec gdb, on peut afficher les variables, il faut juste faire:
    ( Le programme est lancé, et c'est arrêté sur l'erreur de segmentation )
    print k
    print i
    Après, vous aurez les valeurs, et comme cela, vous pourrez savoir quelle est la cause de l'erreur. Et comme le rappel ma signature, lorsque l'on connait la cause d'une erreur, on sait comment la résoudre .
    ( Note: Avec gdb on peut placer des points d'arrêt pour arrêter le programme là où on le veut:
    break fichier.c : numero_de_la_ligne
    On peut aussi faire du pas à pas:
    next
    ( ou n, lorsque l'on est fainéant )
    Et on peut faire du pas à pas en entrant dans les fonctions:
    step
    ( ou s, pour les mêmes fanéant )
    )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

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

Discussions similaires

  1. comment résoudre les erreurs de généricité?
    Par broumbroum dans le forum Langage
    Réponses: 4
    Dernier message: 31/10/2006, 11h59
  2. [VB.Net] Comment résoudre l'erreur si suppression dans la table maitre ?
    Par Alexandre` dans le forum Accès aux données
    Réponses: 1
    Dernier message: 26/08/2006, 15h51
  3. [Oracle 10g] Comment résoudre une erreur ORA-3000
    Par DoRiane dans le forum Oracle
    Réponses: 3
    Dernier message: 10/04/2006, 09h44
  4. comment résoudre l'erreur ORA-22992
    Par sofian001 dans le forum Oracle
    Réponses: 2
    Dernier message: 05/10/2005, 10h41
  5. [ODP][TAF]Comment résoudre l'erreur TNS-12152 ?
    Par Laurent Dardenne dans le forum Oracle
    Réponses: 2
    Dernier message: 21/04/2005, 19h10

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