0
當即時嘗試解析CORBA引用時,我收到分段錯誤。無論是盲人還是我做了一些非常愚蠢的事情,因爲這不起作用。我使用ACE 5.7.9 TAO 1.7.9用於CORBA。想知道是否有人可以幫助我?嘗試解析CORBA引用時出現C++分段錯誤
段錯誤似乎發生在「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輪廓,
// 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;
}
如果您不提供核心轉儲,這是一個很糟糕的問題。人們只能猜測。 – 2010-09-09 13:09:56
不幸的是它沒有產生核心轉儲。我能夠從gdb獲得堆棧跟蹤,但即使如此,它也指向了動態請求,這是我的猜測是錯誤的。這是一個線程應用程序,因此它可能沒有顯示在正確的地方。 – nixgadgets 2010-09-09 14:26:00