CORBA C++/Java 应用程序中服务器端的分段错误(核心转储)
Posted
技术标签:
【中文标题】CORBA C++/Java 应用程序中服务器端的分段错误(核心转储)【英文标题】:Segmentation fault (core dumped) on Server side in CORBA C++/Java application 【发布时间】:2012-09-05 19:45:06 【问题描述】:我有这样的代码:
interface Employee
string getLastname();
;
#include "Employee.idl"
interface Work
Employee getEmployee(in short id);
;
服务器文件:
#include "Employee.hh"
class EmployeeImpl : public POA_Employee
private:
char* lastname;
int id;
public:
EmployeeImpl(const char* lastname, int id);
char* getLastname();
;
#include "EmployeeImpl.h"
EmployeeImpl::EmployeeImpl(const char* lastname, int id)
this->lastname = const_cast<char*>(lastname);
this->id = id;
char* EmployeeImpl::getLastname()
return this->lastname;
#include "Work.hh"
#include <vector>
#include "EmployeeImpl.h"
using namespace std;
class WorkImpl : public POA_Work
private:
vector<EmployeeImpl> employees;
public:
WorkImpl();
Employee_ptr getEmployee(::CORBA::Short id);
;
#include "WorkImpl.h"
WorkImpl::WorkImpl()
EmployeeImpl ei1("Doe", 1);
EmployeeImpl ei2("Smith", 2);
EmployeeImpl ei3("Brown", 3);
employees.push_back(ei1);
employees.push_back(ei2);
employees.push_back(ei3);
Employee_ptr WorkImpl::getEmployee(::CORBA::Short id)
return employees[id]._this();
客户端文件:
import java.util.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import java.io.*;
public class Client
public static void main(String [] args)
try
org.omg.CORBA.ORB clientORB = org.omg.CORBA.ORB.init(args, null);
if (clientORB == null)
System.out.println("Problem while creating ORB");
System.exit(1);
org.omg.CORBA.Object objRef = clientORB.resolve_initial_references("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
Work work = WorkHelper.narrow(ncRef.resolve_str("WorkService"));
Employee e = work.getEmployee((short)1);
System.out.println(e.getLastname());
e = work.getEmployee((short)2);
System.out.println(e.getLastname());
e = work.getEmployee((short)3);
System.out.println(e.getLastname());
catch(Exception e) System.out.println(e.getMessage());
当我运行服务器,然后是客户端时,我在客户端看到:
史密斯
代替:
Doe Smith Brown
当客户端收到消息时,我在服务器端看到:
分段错误(处理转储)
和服务器崩溃。我的代码有什么问题?我在 Kubuntu 上使用 omniORB 和 idlj,并使用 g++ 和 javac 来编译我的文件。
这是我的整个项目: http://www44.zippyshare.com/v/60244821/file.html
【问题讨论】:
【参考方案1】:您没有遵循关于参数传递的 IDL 到 C++ 映射规则。特别是在服务器上:
char* EmployeeImpl::getLastname()
return this->lastname; // this is the problem
您需要返回动态分配的内存,因为骨架代码将在通过线路将其编组到客户端后将其释放(使用CORBA::string_free
)。
这应该是:
char* EmployeeImpl::getLastname()
return CORBA::string_dup(this->lastname);
这一切都在 Henning & Vinowski 的书Advanced CORBA Programming with C++中得到了解释。
您遇到的另一个问题是您正在使用基于 1 的索引对向量进行索引。但是 vector 使用基于 0 的索引方案。要解决此问题,请更改您的客户端调用,或将您的服务器实现更改为以下内容:
Employee_ptr WorkImpl::getEmployee(::CORBA::Short id)
if (id >= 1 && id <= employees.size())
return employees[id - 1]._this(); // convert to 0-based indexing
else
// throw some type of exception
【讨论】:
在看到您的索引问题后更新了我的答案。 @Brian Neal:非常感谢。我还是 *** 和 Corba 的新手 :) 有时我看不到明显的东西 :P 谢谢,当然有帮助 ;)以上是关于CORBA C++/Java 应用程序中服务器端的分段错误(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章