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++

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    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 émérite
    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
    Points : 2 799
    Points
    2 799
    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 régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    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 émérite
    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
    Points : 2 799
    Points
    2 799
    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 régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    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
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    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.

  7. #7
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    pour repérer vos jardinage mémoire, lancer la chose avec valgrind et il vous dira tout

    valgrind est un outil dont l'utilisation est indispensable en C++, il faut l'utiliser de temps de temps même si l'exécution de votre application semble mercher parfaitement. valgrind ne demande rien de particulier à la compilation (si ce n'est de compiler en mode débug (-g) bien-sûr), la seule chose c'est que l'exécution est très ralentie, mais il y a des limites à tout. A noter que cette merveille est gratuite
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Note: En ajout à ce qu'a dit bruno_pages, valgrind n'est pas un debuggueur du même type que gdb. gdb peut faire du pas à pas, affichage des variables, et tout un tas de trucs ( tel un debuggueur ) alors que valgrind est plus un analyseur.
    Valgrind va donc vérifié tout vos appels aux fonctions, aux variables, en se concentrant principalement sur les erreurs mémoires.
    À la fin de son execution il affichera la taille de la fuite de mémoire, et pendant l'execution il affichera les erreurs mémoires. Les erreurs mémoire sont:
    - Accès hors des limites d'un tableau ( et oui, cela ne provoque pas toujours une erreur de segmentation )
    - Accès a des variables non intialisées
    - Surement d'autre ...

    Donc lors du developpement d'un logiciel, il est important d'avoir toujours gdb ET valgrind à porté de main. Ils sont complémentaires, et avec de tel outils, on peut faire des programmes très propres
    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.

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Merci beaucoup pour votre aide !

    J'ai résolu toutes mes erreurs

    Encore merci à LittleWhite pour l'info sur gdb.

    A bientôt !

+ 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, 12h59
  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, 16h51
  3. [Oracle 10g] Comment résoudre une erreur ORA-3000
    Par DoRiane dans le forum Oracle
    Réponses: 3
    Dernier message: 10/04/2006, 10h44
  4. comment résoudre l'erreur ORA-22992
    Par sofian001 dans le forum Oracle
    Réponses: 2
    Dernier message: 05/10/2005, 11h41
  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, 20h10

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