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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Dev C++, CUDA
    Inscrit en
    Mai 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Nouvelle-Zélande

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 83
    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 confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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 confirmé
    Homme Profil pro
    Dev C++, CUDA
    Inscrit en
    Mai 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Nouvelle-Zélande

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 83
    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 confirmé
    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
    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 chevronné
    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
    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
    Membre chevronné
    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
    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!

  9. #9
    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

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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"...
    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.

  11. #11
    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

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

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 83
    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.

+ 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