gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:55:51 26 4
gpt4 key购买 nike

当我尝试解析 CORBA 引用时,我收到了一个段错误。要么我瞎了,要么我做了一些非常愚蠢的事情,因为这行不通。我正在为 CORBA 使用 ACE 5.7.9 TAO 1.7.9。想知道是否有人可以帮助我???

段错误似乎发生在“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;
}

最佳答案

该死,一个问题中有很多代码......

在这种情况下,我的下一步是拆分那条有问题的行:

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

进入尽可能多的部分,并尝试查看哪个部分崩溃。之后,尝试查看该部分有什么问题。

关于尝试解析 CORBA 引用时出现 C++ 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3676501/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com