分段错误,访问自定义的 gsoap 标头

Segmentation Fault while accessing custom defined gsoap header

本文关键字:gsoap 标头 自定义 访问 错误 分段      更新时间:2023-10-16

我们试图在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 显示客户端没有向服务器发送标头值,例如 .

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

谢谢。

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