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 :

bus error sur une machine SUN


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Dev C++, CUDA
    Inscrit en
    Mai 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Dev C++, CUDA
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2005
    Messages : 83
    Points : 129
    Points
    129
    Par défaut bus error sur une machine SUN
    Bonjour,

    J'ai developpez un code sur des machine Linux (Suse et Fedora)
    Tout marche bien, ca compile bien.

    La je dois basculer sur une machine SUN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pbil:subtil uname -a
    SunOS pbil 5.9 Generic_117171-07 sun4u sparc SUNW,Sun-Fire-880
    Ca compile bien mais a l'execution j'ai un "Bus error"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    pbil:subtil make
    g++ -Wall -I. -g -O2 -c Chabot.cxx -o Chabot.o
    g++ -Wall -I. -g -O2 -c libChabot.cxx -o libChabot.o
    g++ -Wall -I. -g -O2 -c GereChabot.cxx -o GereChabot.o
    g++ -Wall -I. -g -O2 -c constantes.cxx -o constantes.o
    g++ -Wall -I. -g -O2 -c Environnement.cxx -o Environnement.o
    g++ -Wall -I. -g -O2 -c main.cxx -o main.o
    main.cxx: In function `int main(int, char**)':
    main.cxx:28: warning: unused variable `Chabot*unChabot'
    g++ -Wall -I. -g -O2 -o exe Chabot.o libChabot.o GereChabot.o constantes.o Environnement.o main.o
    pbil:subtil ./exe
    Bus error
    Ce qui est bisare c'est que sur ma machine Fedora, ca s'execute sans probleme.
    Le pire c'est que je n'arrive pas a debugger avec gdb sur la machine SUN, il me dis quasiment tout le temps "Cannot access memory at address"

    Pourriez me donner une piste ?

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Fedora/Linux et Sun ce sont 2 choses différentes ;
    Linux est peut-être + souple et permissif sur les allocations et ...fuites mémoires
    En d'autres termes si fuite mémoire ou faute de protection mémoire sous SUN alors blocage de l'OS

    donc vérifier tous les malloc, free et autres

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par mhtrinh
    Le pire c'est que je n'arrive pas a debugger avec gdb sur la machine SUN, il me dis quasiment tout le temps "Cannot access memory at address"

    Pourriez me donner une piste ?
    Les deux différences qui me semblent pertinentes sont:
    - sparc est big endian, x86 little endian
    - sparc a besoin que les accès mémoires soient correctement alignés

    Quelle est donc cette adresse à laquelle tu ne peux pas accèder, et comment la formes-tu?

  4. #4
    Membre habitué
    Homme Profil pro
    Dev C++, CUDA
    Inscrit en
    Mai 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Dev C++, CUDA
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2005
    Messages : 83
    Points : 129
    Points
    129
    Par défaut
    Pour les fuites de memoires je vais essayer de les trouver. Ca va etre dur (et encore plus sans gdb )

    Pour ce qui conserne gdb ... en fait je n'arrive pas a acceder a aucune variable. Exemple concret :
    dans le main :
    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
     
    int main(int argc,char **argv)
    {
        int test = 0;
        // Seed pour la fonction rand
        srand(time(NULL));
     
     
        GereChabot *pop;
        Chabot *unChabot;
     
        Environnement *env;
        Param opt;
        charger(CONFIG_FILE,&opt);
        //printf("apres charger(): %d\n",opt.taille_souspatch);
        env = new Environnement(&opt);
     
        //    printObstacle(stderr,&env,&opt);
        env->chargerEnvironnement();
     
    ...
    dans gdb :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (gdb) p test
    No symbol "test" in current context.
    (gdb) p opt
    Cannot access memory at address 0xffbfc648
    Pourtant dans le make il y a bien le -g.

  5. #5
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Attention ceci est du C++, tu n'es pas sur le bon forum ...

    Pour les fuites de memoires je vais essayer de les trouver. Ca va etre dur (et encore plus sans gdb )
    Pas besoin de gdb, des fprintf (ou cerr pour le C++) un peu partout, et vérifie toutes les allocations mémoire

  6. #6
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Bus error arrive quand tu essaies d'accéder à une adresse inexistante (par exemple valeur d'adresse supérieure à la taille de l'espace d'adressage du processus). Celà explique que d'un système à l'autre, il peut y avoir des différences.
    Cherche dans quelle portion de code ça se produit, avec des printf() si gbd ne veut rien savoir
    La plupart du temps (d'après mon expérience sous Solaris ), il s'agit de l'utilisation d'un pointeur non initialisé.

  7. #7
    mat.M
    Invité(e)
    Par défaut
    >>charger(CONFIG_FILE,&opt);


    Est-ce que l'utilisateur a tous les droits pour écrire , lire des fichiers ?

  8. #8
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Les deux différences qui me semblent pertinentes sont:
    - sparc est big endian, x86 little endian
    - sparc a besoin que les accès mémoires soient correctement alignés

    Quelle est donc cette adresse à laquelle tu ne peux pas accèder, et comment la formes-tu?
    Il me semble que c'est transparent pour le programmeur en C à moins de manipuler des données bit à bit par exemple

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Non, ce n'est pas transparent non plus si tu charges un fichier de données binaires sans conversion alors qu'il vient d'une autre machine.

    Ce n'est pas transparent non plus si tu fais des trafics entre int * et char *.

    Bref, ça foire dès que tu veux manipuler des données octet par octet en utilisant les mauvaises fonctions "pour gagner du temps"...

  10. #10
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Médinoc
    Non, ce n'est pas transparent non plus si tu charges un fichier de données binaires sans conversion alors qu'il vient d'une autre machine.

    Ce n'est pas transparent non plus si tu fais des trafics entre int * et char *.

    Bref, ça foire dès que tu veux manipuler des données octet par octet en utilisant les mauvaises fonctions "pour gagner du temps"...
    Oui tout a fait

  11. #11
    Membre habitué
    Homme Profil pro
    Dev C++, CUDA
    Inscrit en
    Mai 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Dev C++, CUDA
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2005
    Messages : 83
    Points : 129
    Points
    129
    Par défaut
    Bonjour,

    J'ai verifie les droits d'ecriture et lecture de fichier. Pas de probleme de ce point vu.

    Par contre, j'aurai besoin de votre aide pour faire du deboggage avec des printf :
    Avec gdb, j'ai trouve que le probleme est au niveau de ma liste chainee, dans une fonction, ca plante sur un if :
    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
    void GereChabot::ajout(Chabot *src,Chabot *nouveau)
    {
        // Si src est vide, on considere que c'est le premier chabot de la liste a creer
        if (src == NULL)
        {
    	premChabot = nouveau;
    	return;
        }
        nouveau->apres = src->apres;
        nouveau->avant = src;
        if (src->apres !=NULL) // <====== Ca fait SIGSEGV ici !!!
          src->apres->avant = nouveau;
        src->apres = nouveau;
     
    }
    Et :
    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
     
    typedef struct Chabot
    {
      unsigned int cid; 
      int stade; 
      int patch; 
      int souspatch; 
      int position; 
      int age; 
      int fecondite;
      bool ismale; 
      float taille; 
      float a;
      float survie_avant;
      float K;
     
      //! pointeur vers le Chabot avant lui dans la liste chainee
      struct Chabot *avant; 
     
      //! pointeur vers le Chabot apres lui dans la liste chainee
      struct Chabot *apres; 
     
    } Chabot;
    Ma question est : comment savoir ce qu'il y a dans src->apres avec un printf ? D'habitude j'utilise gdb mais la ... il veut pas me l'afficher.

  12. #12
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Si tu veux afficher le pointeur, un %p (histoire de voir s'il n'est pas nul), sinon, tu utilises les formateurs par défaut pour les différentes variables.

    Utilise fprintf et non pas printf, ainsi tu peux envoyer ça vers la sortie d'erreur non bufferisée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fprintf(stderr,"%p", src->apres );
    De plus, fait attention à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        nouveau->apres = src->apres;
        nouveau->avant = src;
        if (src->apres !=NULL) // <====== Ca fait SIGSEGV ici !!!
          src->apres->avant = nouveau;
        src->apres = nouveau;
    Tu fais l'hypothèse que ton erreur est sur le if or elle est peut être avant. Est tu sur que nouveau n'est pas NULL ?

  13. #13
    Membre habitué
    Homme Profil pro
    Dev C++, CUDA
    Inscrit en
    Mai 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Dev C++, CUDA
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2005
    Messages : 83
    Points : 129
    Points
    129
    Par défaut
    J'ai trouve le bug. Le pointeur n'etait pas null mais il etait pas bon. J'avais oublie d'initialiser les pointeur avant et apres a NULL lors de leur creation. Sur Linux, ca doit le faire automatiquement , mais pas sur SUN, ca expliquerait le probleme que j'ai eu.
    Je pensais pas faire une telle connerie de debutant ...

    En tout cas, merci beaucoup tout le monde

    Ya d'autres bugs ... mais je pense pouvoir continuer mtn

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mhtrinh
    J'ai trouve le bug. Le pointeur n'etait pas null mais il etait pas bon. J'avais oublie d'initialiser les pointeur avant et apres a NULL lors de leur creation.
    http://emmanuel-delahaye.developpez.com/goret.htm
    Force 10 ! Bravo !

  15. #15
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Citation Envoyé par joellel
    La plupart du temps (d'après mon expérience sous Solaris ), il s'agit de l'utilisation d'un pointeur non initialisé.
    Si tu lisais les réponses, tu aurais peut-être résolu ton problème plus tôt!

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

Discussions similaires

  1. [reseaux] Lister les processus sur une machine donnée
    Par BEAUJAULT dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 29/07/2004, 15h55
  2. Réponses: 8
    Dernier message: 13/07/2004, 09h00
  3. Savoir quel OS est installer sur une machine
    Par batmat86 dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/06/2004, 16h16
  4. Comment récupérer la liste des logiciels installés sur une machine ?
    Par david_chardonnet dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 19/09/2003, 17h41
  5. [Débutant] Connexion sur une machine distante protégée
    Par arthix dans le forum Développement
    Réponses: 3
    Dernier message: 28/08/2003, 09h46

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