2010-09-09 139 views
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; 
} 
+0

如果您不提供核心转储,这是一个很糟糕的问题。人们只能猜测。 – 2010-09-09 13:09:56

+0

不幸的是它没有产生核心转储。我能够从gdb获得堆栈跟踪,但即使如此,它也指向了动态请求,这是我的猜测是错误的。这是一个线程应用程序,因此它可能没有显示在正确的地方。 – nixgadgets 2010-09-09 14:26:00

回答

2

荡,这是一个很大的代码在问题...

我的下一个看起来像这样的情况将是拆分offendi吴行:

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

成许多部分可能,并尝试看看哪一部分崩溃。之后,试着看看那一部分有什么问题。

相关问题