我正在使用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
}
}
}
}
我很感激任何帮助,了解导致此次崩溃的原因。我在这里缺少任何共享指针吗? 假设没有任何指针被共享我错了吗?
谢谢!