xml-rpc多线程客户端崩溃(c ++)

时间:2016-01-17 08:25:24

标签: c++ multithreading shared-memory xml-rpc variadic-functions

我正在使用xml-rpc,release 1.41

我正在实现一个类来处理xml-rpc连接。每个实例都有一个不同的xmlrpc_client来调用xml-rpc。

这是用于调用xml-rpc端点的代码示例:

executeCommand(xmlrpc_value** ret, const string& methodName, const string& format, int numArgs, ...) {

  *ret = NULL;
  va_list args;

  xmlrpc_env env;
  xmlrpc_env_init(&env);
  xmlrpc_value* arg_list = NULL;
  const char* suffix = NULL;

  va_start(args, numArgs);
  xmlrpc_build_value_va(&env, format.c_str(), args, &arg_list,&suffix);
  xmlrpc_print_value(arg_list);
  va_end(args);

  if (!env.fault_occurred){
    if (*suffix != '\0')
    {
      xmlrpc_faultf(&env, "Junk after the argument ""specifier: '%s'.  ""There must be exactly one arument.", suffix);
    }
    else{
      xmlrpc_server_info* server = NULL;
      getActiveServerInfo(&server);

      CleanEnvAndReturnRV(env);
      xmlrpc_env_init(&env);
      xmlrpc_client_call2(&env, m_client, server, methodName.c_str(), arg_list, ret); // Both threads are making a successful call. 
    }
    xmlrpc_DECREF(arg_list);      // <<< **Crashes here **  
  } 
  return CleanEnvAndReturnRV(env);

}

在我看来,每个线程都使用xmlrpc_build_value_va创建自己的xml-rpc值,因此线程之间不会共享指针。 尽管如此,当两个线程调用此函数时,它们在调用 xmlrpc_DECREF(arg_list); 时会崩溃,因为一个或多个refcounts为0。

这是来自gdb的反向跟踪:

  来自/lib/x86_64-linux-gnu/libc.so.6的raise()中的

0 0x00007ff814271107

     

(gdb)bt

     来自/lib/x86_64-linux-gnu/libc.so.6的raise()中的

0 0x00007ff814271107

     来自/lib/x86_64-linux-gnu/libc.so.6的abort()中的

1 0x00007ff8142724e8

     

2 0x00007ff820977c07 in xmlrpc_abort_if_array_bad(arrayP =)at xmlrpc_array.c:43

     位于xmlrpc_array.c的xmlrpc_destroyArrayContents(arrayP = 0x7ff7c382a080)中的

3 0x00007ff820977c43:64

     

4 0x00007ff820974f90在destroyValue(valueP = 0x7ff7c382a080)xmlrpc_data.c:77

     

5 xmlrpc_DECREF(valueP = 0x7ff7c382a080)xmlrpc_data.c:155

     

6 0x00007ff820977c5e in xmlrpc_destroyArrayContents(arrayP = 0x7ff80d49c860)at xmlrpc_array.c:69

     

7 0x00007ff820974f90在destroyValue(valueP = 0x7ff80d49c860)xmlrpc_data.c:77

     

8 xmlrpc_DECREF(valueP = 0x7ff80d49c860)xmlrpc_data.c:155

     执行命令中的

9 0x00007ff81faa7fe8(_xmlrpc_value **,std :: string const&amp;,std :: string const&amp;,int,...)()

来自xmlrpc_array.c:

void xmlrpc_abort_if_array_bad(xmlrpc_value * const arrayP) {

    if (arrayP == NULL)
        abort();
    else if (arrayP->_type != XMLRPC_TYPE_ARRAY)
        abort();
    else {
        size_t const arraySize =
            XMLRPC_MEMBLOCK_SIZE(xmlrpc_value*, &arrayP->_block);
        xmlrpc_value ** const contents = 
            XMLRPC_MEMBLOCK_CONTENTS(xmlrpc_value*, &arrayP->_block);

        if (contents == NULL)
            abort();
        else {
            size_t index;

            for (index = 0; index < arraySize; ++index) {
                xmlrpc_value * const itemP = contents[index];
                if (itemP == NULL)
                    abort();
                else if (itemP->refcount < 1)  
                    abort(); // Line 43 . Aborts here
            }
        }
    }
}

我很感激任何帮助,了解导致此次崩溃的原因。我在这里缺少任何共享指针吗? 假设没有任何指针被共享我错了吗?

谢谢!

0 个答案:

没有答案