【问题标题】:process SIGABRT when PortableServer::ServantLocator preinvoke() returns CORBA::OBJECT_NOT_EXIST()当 PortableServer::ServantLocator preinvoke() 返回 CORBA::OBJECT_NOT_EXIST() 时处理 SIGABRT
【发布时间】:2015-07-24 10:37:44
【问题描述】:

以下是我使用的类的摘录,它继承自 TAO 中的 PortableServer::ServantLocator 类。当调用preinvoke()的重写方法时,如果servant为NULL(在此实例之前已经被销毁),我会抛出CORBA::OBJECT_NOT_EXIST()异常,如下所示

class Locator : public PortableServer::ServantLocator {
    public:
        PortableServer::Servant preinvoke(
                const PortableServer::ObjectId& oid,
                PortableServer::POA_ptr         adapter,
                const char *                    operation,
                Cookie&                         cookie ) throw ()
        {
            .
            .
            .// retrieve servant
            .
            if (servant == NULL) {
                //return NULL;
                throw CORBA::OBJECT_NOT_EXIST ();
            }
            return servant;
        }
    };

但这会使进程崩溃,并出现以下核心转储

  [1] __exdbg_notify_of_unexpected(0xfffffc7ffad91640, 0x1, 0xfffffc7ffb849200, 0xfffffc7ffce202e0, 0x18, 0x101010101010101), at 0xfffffc7ffce07f90
  [2] __Crun::ex_chk_unexpected(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffc7ffce09234
  [3] Locator::preinvoke(this = 0x7c77f0, oid = CLASS, adapter = 0xdcf538, operation = 0xfffffc7ffad92740 "nextData", cookie = (nil)), line 238 in "locator.cpp"
  [4] TAO::Portable_Server::RequestProcessingStrategyServantLocator::locate_servant(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffc7ffd7521d2
  1. 为什么 TAO 库没有捕捉到我抛出的异常?我对此进行了很多谷歌搜索,但找不到任何解决方案。我参考示例here 抛出了这个异常。我还尝试返回 NULL,希望在 TAO 中的调用方函数 RequestProcessingStrategyServantLocator::locate_servant() 处检查 NULL 指针异常可以处理它。即使这样,我也会得到相同的核心转储。

  2. 我的另一个问题是,如果我已经销毁了仆人并删除了它的引用,为什么 TAO 会首先调用 preinvoke()。谁能给我一个很好的例子,说明应该如何删除 this 引用,这样 preinvoke() 就不会被调用?

编辑

我正在使用 ACE TAO 6.0.7_x86

正如@Johnny Willemsen 的回复中所建议的,我在客户端代码中发现异常,即调用服务器操作的地方。但它没有在这里被抓住。代码仍然崩溃。

我的客户端代码如下所示

      try 
      {
        rs->getValue(tab.out()); 
      }
      catch (CORBA::OBJECT_NOT_EXIST& x) 
      {
          cout << "OMG OMG ERROR: CORBA  : " << x << endl;
      }

【问题讨论】:

    标签: c++ corba ace tao


    【解决方案1】:

    您很可能没有在客户端代码中捕获异常,异常从服务器传递回您的客户端。在 TAO 发行版中,另请参阅 TAO/tests/On_Demand_Activation 以了解此功能的单元测试。

    【讨论】:

    • 感谢@Johnny 的回复,我看了一下示例,并尝试在调用orb 的run() 时捕获示例。尝试{ orb->run(); } catch (const CORBA::Exception& ex) { cout
    • 您必须将 catch 添加到您在服务器上调用操作的客户端代码中
    • Johnny,我已经包含了 try catch,即调用服务器代码的地方。但它仍然崩溃。有没有办法在仆人被销毁时通知,以便不会首先调用 preinvoke
    猜你喜欢
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    相关资源
    最近更新 更多