尝试解析CORBA引用时C ++分段错误

时间:2010-09-09 12:28:29

标签: c++ segmentation-fault corba ace tao

当我尝试解析CORBA引用时,我收到了分段错误。无论是我是盲人还是我做了一些非常愚蠢的事情,因为这不起作用。我使用ACE 5.7.9 TAO 1.7.9进行CORBA。想知道是否有人可以帮助我???

分段错误似乎发生在“serverRef = Corba :: Orb :: getOrb()。resolveObjectReference(myIOR.c_str());”行上评论此行将导致应用程序正常运行。

我已经复制了以下所有的依赖代码。

bool ClsSend::ServerObject::resolveServerRef()
{
  clssendlog << debug << "In ClsSend::ServerObject::resolveServerRef 1" << endl;
 bool referenceIsUsable = true;
 ostringstream errMsg;

 // Are we dealing with a new reference?
 if (CORBA::is_nil (serverRef.in()))
 {
   try {
     Monitor crit (mutexCoreRef);

     if (CORBA::is_nil (serverRef.in()))
     {
       // Step 1: Resolve the object reference
       serverRef = Corba::Orb::getOrb().resolveObjectReference <GenericServerWithTransport> (myIOR.c_str());

       // Step 2: Ping to check connectivity if reference is not null
       if (!CORBA::is_nil (serverRef.in()))
         serverRef->ping();
       else
       {
         errMsg << "Not registered in naming server.";
         referenceIsUsable = false;
       }
     }
   } catch (const CORBA::COMM_FAILURE &exc) {
     errMsg << "CORBA::COMM_FAILURE";
     referenceIsUsable = false;
     setRefNil();
   } catch (const NamingException &exc) {
     errMsg << exc;
     referenceIsUsable = false;
     setRefNil();
   } catch (...) {
     errMsg << "Unknown exception";
     referenceIsUsable = false;
     setRefNil();
   }
 }
 return referenceIsUsable;

}

/////////////////////////////////////////////// //////////////////

resolveObjectReference outline,

// Resolve a reference to an object, return a nil object reference if none is bound
// Specify the name with a delimited string
template<class T> typename T::_var_type resolveObjectReference(const string &name,
    char delimiter = '/')
{
  return Corba::resolveObjectReference<T> (orb_.in(), name, delimiter);
}

// Resolve a reference to an object, return a nil object reference if none is bound
// Specify the name with a delimited c-style string
template<class T>
typename T::_var_type resolveObjectReference(const CORBA::ORB_ptr & orb, const string &name, char delimiter = '/')
{
  return resolveObjectReference<T> (orb, convertToCosName(name, delimiter));
}

// Resolve a reference to an object, return a nil object reference if none is bound
// Specify the name with a CosNaming::Name object
template<class T>
typename T::_var_type resolveObjectReference(const CORBA::ORB_ptr & orb, const CosNaming::Name &name)
{
  typename T::_var_type typedObj;
  CORBA::Object_var obj;

  // Check it is a valid name
  assert_throw(name.length() > 0);

  // Try to resolve the object reference
  try
  {
    obj = getNamingContext(orb)->resolve(name);

    // If the object reference was bound to nil emit a warning but return nil, do not throw
    if (CORBA::is_nil(obj.in()))
    {
      liblog << warning << "Object reference " << toString(name)
          << " bound to nil in naming service" << endl;
    }
    else
    {
      typedObj = T::_narrow(obj.in());

      // If the object reference narrowed to nil this indicates the object was of the wrong type
      if (CORBA::is_nil(typedObj.in()))
      {
        liblog << error << "Object reference " << toString(name)
            << " is not of the expected type " << typeid(T).name() << endl;
        throw NamingException("Object reference narrows to a nil");
      }
    }
  }
  catch (const CosNaming::NamingContext::NotFound &exc)
  {
    // Object not bound - return nil
  }
  return typedObj;
}

///////////////////////////////////////////////////////////////////////////
// Local function - getNamingContext
///////////////////////////////////////////////////////////////////////////
CosNaming::NamingContext_var getNamingContext(CORBA::ORB_ptr orb)
{
  // Get the initial reference to the naming service
  CORBA::Object_var nameService;

  // Try to get a reference to the naming service
  nameService = orb->resolve_initial_references("NameService");
  if (CORBA::is_nil(nameService.in()))
  {
    liblog << error << "Name service reference bound to nil" << endl;
    throw NamingException("Naming service reference bound to nil");
  }

  // cerr << "Name service IOR: " << getORB()->object_to_string (nameService) << endl;

  // Narrow the reference to the root naming context
  CosNaming::NamingContext_var rootContext =
      CosNaming::NamingContext::_narrow(nameService.in());
  if (CORBA::is_nil(rootContext.in()))
  {
    liblog << error << "Name service reference resolved to nil" << endl;
    throw NamingException("Naming service reference resolves to nil");
  }
  return rootContext;
}

///////////////////////////////////////////////////////////////////////////
// Local function - convertToCosName
///////////////////////////////////////////////////////////////////////////
CosNaming::Name convertToCosName(const string &strname, char delimiter)
{
  const char *name = strname.c_str();

  CosNaming::Name cosName;
  cosName.length(count(name, name + strlen(name), delimiter) + 1);

  size_t index = 0;
  const char *next = strchr(name, delimiter);
  if (next == NULL)
  {
    next = name + strlen(name);
  }
  while (next != NULL)
  {
    cosName[index].id = string(name, next).c_str();
    cosName[index++].kind = CORBA::string_dup("");
    if (*next)
    {
      name = next + 1;
      next = strchr(name, delimiter);
      if (next == NULL)
      {
        next = name + strlen(name);
      }
    }
    else
    {
      next = NULL;
    }
  }
  return cosName;
}

1 个答案:

答案 0 :(得分:2)

Dang,这是一个问题中的很多代码......

我在下一个这样的案例中将会分割出违规行:

serverRef = Corba::Orb::getOrb().resolveObjectReference (myIOR.c_str());

尽可能多的部分,并尝试查看哪个部分崩溃。在那之后,试着看看那个部分出了什么问题。