访问自定义的gsoap标头时出现分段错误

时间:2014-04-03 13:25:52

标签: c++ c soap gsoap

我们正在尝试在gsoap结构中包含自定义标头。 以下是我们的标题定义:

typedef struct apollo__Header
{
   char *UserName;
   int VenueId;
   time_t TransactionTime;
};

struct SOAP_ENV__Header
{ 
   struct apollo__Header *apollo__Header 0; /* mustUnderstand */
};

我们使用soapcpp2编译器使用以下命令生成了envStub和其他头文件/代码:

$(SOAPCPP2) -z1 -d env -p env $(GSOAP_HEADERS) env_soap.h
$(SOAPCPP2) -z1 -n -t -d gsoap $(GSOAP_HEADERS) apollo_soap.h

在客户端代码中,我们已初始化此标头,如下所示:

void
prepareSoapHeader(soap* soap, const rString username)
{
    //pProperties props = AppProps::getProperties();
    apollo__Header *header = (apollo__Header*)malloc(sizeof(apollo__Header));
    header->UserName = new char[username.length() + 1];
    strcpy(header->UserName, username.toCString());
    header->VenueId = 110;
    header->TransactionTime = 0;
    soap->header = (SOAP_ENV__Header*)malloc(sizeof(SOAP_ENV__Header));
    soap->header->apollo__Header = header;
}

现在,当我们在服务器上调用Web服务时,我们在访问此标头时会在服务器上出现分段错误! 服务器在执行以下代码时崩溃:

int apollo__getAvailableTestIDs(soap* soap, apollo__vAvailableTestIDs &resp)
{
   apollo__Header *header = getSoapHeader(soap);       
   if(header != NULL){
        AccessLogger l(soap->peer,"getAvailableTestIDs", "", header->UserName);
   }
   else{
        AccessLogger l(soap->peer,"getAvailableTestIDs", "", "UNKNOWN_USER");
}

调试显示:

(gdb) p *soap->header->apollo__Header->UserName
Cannot access memory at address 0xc0de000001da1230
(gdb) p *soap->header->apollo__Header
Cannot access memory at address 0xc0de000001da1230

我们试图找出根本原因并发现Header正在通过在客户端代码中打印它的值来正确初始化。 但是tcpdump显示客户端没有向服务器发送标头值,就像它一样。

这似乎是一些配置错误。可以帮助指出这里出了什么问题。 任何帮助将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:0)

如果有多个.c文件,并且是重新编译,请确保您拥有所有具有最新结构更改的目标文件。