Skip to main content

Problem:

  • Product : VisiBroker 7.0
  • Platform : Unix and Linux

Unable to catch thrown exception from POA->activate_object_with_id() and encountered a segmentation fault.

 void CorbaManager::restart()
 {
     int nms_funcnumber=fncRESTART;
     try {
         NMSLog_traceLine( [DBG],nms_funcnumber);
         myPOA->activate_object_with_id(managerId, pCmdReceiver);
         NMSLog_traceLine( [DBG],nms_funcnumber);
     } catch (const CORBA::Exception& e) {
         NMSLog_traceLine( [DBG],nms_funcnumber); <- Segmentation Fault here
     }
...

The exception was thrown when managerId already existed in active map when calling activate_object_with_id().

The customer also confirmed that the same problem occur on modified bank_agent's Server:

Server.C:
 try{
...
    // Activate the servant with the ID on myPOA
    myPOA->activate_object_with_id(managerId, &managerServant);
    // Duplicate above to throw PortableServer_POA::ServantAlreadyActive exception
    myPOA->activate_object_with_id(managerId, &managerServant);
...
  catch(const CORBA::Exception& e) {
    cerr << e << endl; <- Segmentation Fault here
    return 1;
  }

Resolution:

The segmentation fault is caused by a VisiBroker function _deactivate_object(), which tried to retrieve object reference which is out of scope in catch{} clause.

To workaround:

1. Use try - catch block as below:
...
    try {
    // Activate the servant with the ID on myPOA
    myPOA->activate_object_with_id(managerId, &managerServant);
    // Duplicate above to throw PortableServer_POA::ServantAlreadyActive exception
    myPOA->activate_object_with_id(managerId, &managerServant);
    }
    catch(PortableServer_POA::ServantAlreadyActive& e) {
     cerr << "Servant Already Active..." << endl;
    }
...

2. Change managerServant's scope to accessible from catch clause.

In the customer's code, the root cause is pCmdReceiver has been out of scope in the catch clause.


#deactivate_object
#VisiBroker
#segmentation
#Security