Précédent   Forum des professionnels en informatique > Autres langages > Autres langages > CORBA
CORBA Forum d'entraide et de discussion sur le développement distribué avec CORBA & les ORB
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/04/2011, 11h24   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 40
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 40
Points : 13
Points : 13
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 :
Citation:
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 :
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 :
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 :
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
L'elfe d'Azur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 15h54   #2
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 40
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 40
Points : 13
Points : 13
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?
L'elfe d'Azur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 18h06   #3
Membre confirmé
 
Homme Julien Enoch
Architecte technique
Inscription : septembre 2006
Messages : 215
Détails du profil
Informations personnelles :
Nom : Homme Julien Enoch
Âge : 36
Localisation : France

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

Informations forums :
Inscription : septembre 2006
Messages : 215
Points : 291
Points : 291
Bonjour,

Citation:
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 :
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)
CorbAddict est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 14h51   #4
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 40
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 40
Points : 13
Points : 13
Super, merci beaucoup, va marche parfaitement.

Et j'ai remplace le NULL :-)

Bonne journee
L'elfe d'Azur est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h43.


 
 
 
 
Partenaires

Hébergement Web