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

CORBA Discussion :

OmniORB - segmentation fault - recuperation d'une reference


Sujet :

CORBA

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 66
    Points : 50
    Points
    50
    Par défaut OmniORB - segmentation fault - recuperation d'une reference
    Bonjour,

    j'ai un probleme d'implementation et comme je ne maitrise pas bien corba, je ne comprends pas pourquoi mon code plante.

    Presentation du projet (simplifie) :
    J'ai une application serveur qui a une connaissance de differents capteurs.
    Dans une application graphique (client), je cherche a pouvoir recuperer les informations de certains capteur pour en modifier les parametres.
    Lorsque je fais une selection d'un capteur, je fais un appel pour recuperer les info (via corba), ca marche, cool . Lorsque je change de selection, tout va toujours bien.
    En revanche des que je cherche a rappeler le capteur selectionne auparavant, mon application plante (au niveau du serveur).

    Voici ce que je recupere avec gdb :
    Program received signal SIGSEGV, Segmentation fault.
    [Switching to Thread 0x7fffe77fe700 (LWP 5866)]
    0x000000000045efa2 in CORBA::Object::_PR_getobj (this=0x2e36b92ddc009bf0)
    at /usr/local/include/omniORB4/CORBA_Object.h:115
    115 inline omniObjRef* _PR_getobj() { return pd_obj; }
    ...
    (gdb) where
    #0 0x000000000045efa2 in CORBA::Object::_PR_getobj (this=0x2e36b92ddc009bf0)
    at /usr/local/include/omniORB4/CORBA_Object.h:115
    #1 0x00007ffff6ee0ae0 in com::stubs::Sensor::_marshalObjRef (obj=0x7fffdc009bf0, s=...)
    at /auto/sop-nas2a/u/sop-nas2a/vol/home_biocore/mgautier/projet/Odin/trunk/build/com/stubs/odin_if.h:2547
    #2 0x00007ffff6eda537 in _0RL_cd_bff0243e28adf15f_65000000::marshalReturnedValues (this=0x7fffe77fd9c0, _n=...)
    at /auto/sop-nas2a/u/sop-nas2a/vol/home_biocore/mgautier/projet/Odin/trunk/build/com/stubs/odin_ifSK.cc:4288
    #3 0x00007ffff7d342ce in omni::GIOP_S::SendReply() () from /usr/local/lib/libomniORB4.so.1
    #4 0x00007ffff7d17cb6 in omniCallHandle::upcall(omniServant*, omniCallDescriptor&) ()
    from /usr/local/lib/libomniORB4.so.1
    #5 0x00007ffff6edbf5f in com::stubs::_impl_Supervisor::_dispatch (this=0x759030, _handle=...)
    at /auto/sop-nas2a/u/sop-nas2a/vol/home_biocore/mgautier/projet/Odin/trunk/build/com/stubs/odin_ifSK.cc:4947
    #6 0x00007ffff7d0a1cd in omni::omniOrbPOA::dispatch(omniCallHandle&, omniLocalIdentity*) ()
    from /usr/local/lib/libomniORB4.so.1
    #7 0x00007ffff7cec6a8 in omniLocalIdentity::dispatch(omniCallHandle&) () from /usr/local/lib/libomniORB4.so.1
    #8 0x00007ffff7d348ff in omni::GIOP_S::handleRequest() () from /usr/local/lib/libomniORB4.so.1
    #9 0x00007ffff7d356a0 in omni::GIOP_S::dispatcher() () from /usr/local/lib/libomniORB4.so.1
    #10 0x00007ffff7d320b5 in omni::giopWorker::real_execute() () from /usr/local/lib/libomniORB4.so.1
    #11 0x00007ffff7d326af in omni::giopWorker::execute() () from /usr/local/lib/libomniORB4.so.1
    #12 0x00007ffff7cdeefc in omniAsyncWorkerInfo::run() () from /usr/local/lib/libomniORB4.so.1
    #13 0x00007ffff7cdf73f in omniAsyncWorker::run(void*) () from /usr/local/lib/libomniORB4.so.1
    #14 0x00007ffff7a1d44d in omni_thread_wrapper () from /usr/local/lib/libomnithread.so.3
    #15 0x000000376fe06ccb in start_thread () from /lib64/libpthread.so.0
    #16 0x000000376f2e0c2d in clone () from /lib64/libc.so.6
    Pour voici les sections de code associe. Tout d'abord pour le serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    com::stubs::Sensor_ptr Process::GetSensor(const char* uid){
        std::string sensorUID(uid);
        if(m_sensors.find(sensorUID)!= m_sensors.end()){
          return m_sensors[sensorUID];
        }
        else{ 
          std::cerr << "[ Process::GetSensor]ERROR : Sensor with uid "<<sensorUID<<" not found"<<std::endl;
          return NULL;
    }
      }
    Et pour le client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    com::stubs::Sensor_ptr UISupervisorInterface::getSensor(const char* uid){
      if(this->supervisor_!=NULL) return this->supervisor_->GetSensor(uid);
      else return NULL;
    }
    Je recupere le pointeur vers mon capteur ainsi (j'ai aussi essaye en utilisant com::stubs::Sensor_var mais ca plante de la meme maniere)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    com::stubs::Sensor_ptr sensor= this->_uiSupervisorInterface->getSensor(id->uid.c_str());
    Merci a tous ceux qui voudront me taper sur les doigts en me disant d'ou vient mon erreur

  2. #2
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 66
    Points : 50
    Points
    50
    Par défaut
    Je pense que le probleme vient de la :
    m_sensors est de type std::map<std::string, com::stubs::Sensor_var>

    or la fonction que j'appelle dans le client est Sensor_ptr getSensor(const char* uid)

    Et je fais le renvoi d'un type Sensor_var au lieu d'un Sensor_ptr.

    Est-ce que cela peut etre la cause de mon erreur?

  3. #3
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 219
    Points : 302
    Points
    302
    Par défaut
    Bonjour,

    Et je fais le renvoi d'un type Sensor_var au lieu d'un Sensor_ptr.
    Est-ce que cela peut etre la cause de mon erreur?
    Oui, il faut renvoyer une "copie" de l'objet, car l'ORB l'effacera après envoi au client. Ici, le _var est casté automatiquement en _ptr, mais sans "copie".
    (je mets "copie" entre guillemets car ce n'est pas réellement une copie, mais plutôt l'incrémentation d'un compteur de référence interne à l'objet, puis une décrémentation plutôt qu'un effacement. Le delete se fera réellement lorsque le compteur tombera à 0)

    Autre erreur: ne pas retourner NULL pour un _ptr, mais utiliser l'opération _nil().
    NULL peut marcher avec certains ORBs, mais pas avec tous.

    Le code suivant devrait donc corriger le problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    com::stubs::Sensor_ptr Process::GetSensor(const char* uid){
        std::string sensorUID(uid);
        if(m_sensors.find(sensorUID)!= m_sensors.end()){
          return com::stubs::Sensor::_duplicate(m_sensors[sensorUID]);
        }
        else{ 
          std::cerr << "[ Process::GetSensor]ERROR : Sensor with uid "<<sensorUID<<" not found"<<std::endl;
          return com::stubs::Sensor::_nil();
    }
      }
    Côté client l'utilisation d'un com::stubs::Sensor_var est préférable pour éviter les fuites mémoires (puisque c'est une "copie" du stub qui est renvoyée par le serveur, c'est au client de l'effacer. Avec un _var, elle sera effacée par le destructeur du _var)

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 66
    Points : 50
    Points
    50
    Par défaut
    Super, merci beaucoup, va marche parfaitement.

    Et j'ai remplace le NULL :-)

    Bonne journee

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

Discussions similaires

  1. Segmentation fault en quittant une application.
    Par VinsS dans le forum Général Python
    Réponses: 1
    Dernier message: 21/04/2010, 18h18
  2. Traiter une erreur "Segmentation Fault"
    Par Looney dans le forum Débuter
    Réponses: 5
    Dernier message: 30/04/2009, 06h51
  3. segmentation fault quand j'exécute une commande java (sablevm)
    Par kris1 dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 13/03/2008, 15h21
  4. Réponses: 9
    Dernier message: 24/01/2008, 12h53
  5. Réponses: 6
    Dernier message: 13/11/2005, 12h11

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