我正在研究使用corba的旧产品。我们正在寻求支持Omniorb作为另一个供应商。我遇到了我们的一个测试中的seg缺点之一,我试图了解我们是否在做错了一些刚刚与其他供应商一起工作的事情,或者是否有Gromniiorb的错误。
我用红色帽子Epel(4.2.0)的Omniiorb版本进行了测试。我还下载并构建了最新版本4.2.3,但仍然看到了错误。
以下是一个测试案例,我认为它演示了我在代码中看到的行为。
#include <omniORB4/CORBA.h>
//#include "typedefs.hh"
#include <iostream>
// only happens with string types.
// primitive CORBA types and user-defined types don't cause the error
int main() {
CORBA::Any any1;
any1 <<= "Hello";
CORBA::Any any2;
any2 = any1; // copy the any, seg fault in omniiorb
// any2 <<= any1; // any inside any, also seg faults
// CORBA::Any any2(any1); // copy constructor, also seg faults
return 0;
}
我知道提取生成的智能指针会导致问题,因为任何人都应保留所有权。但是,在复制任何内容的情况下,不应该做一个深层副本吗?我在这里缺少什么?
我还有另一个简短的示例,即如果认为此示例无代表性,则更接近我们的旧代码所做的涉及简单的IDL。
旧代码所做的要旨是复制用于该值的属性,因此可以是任何东西。我们过去没有看到Visibroker或Ace Tao的任何问题。
问题在我们身边,因为我们没有通过Corba :: orb_init()()初始化ORB运行时。
因此,问题中描述的示例无效,应该是:
#include <omniORB4/CORBA.h>
#include "typedefs.hh"
#include <iostream>
// only happens with string types.
// primitive CORBA types and user-defined types don't cause the error
int main(int argc, char*argv[]) {
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, "omniORB4");
CORBA::Any any1;
any1 <<= "Hello";
CORBA::Any any2;
any2 = any1;
return 0;
}
我们的大多数CORBA代码都会初始化ORB运行时,但是我遇到的测试是一个单位测试,涉及翻译和复制不同CORBA类型的单位测试。我们认为仅在拨打网络呼叫时才需要初始化,而不是在任何与CORBA相关的呼叫之前都需要。
测试代码恰好与Orbix,Visibroker和Ace Tao一起使用,因为在这些实现中,无关紧要。它在Omniiorb中失败了,因为某些本机代码集内部实现详细信息(以及其他内容)没有初始化(它们是null),直到调用Orb_init()并导致SEG故障。