多线程程序在HTTPS请求上崩溃

时间:2014-03-27 10:28:07

标签: c multithreading curl openssl libcurl

在我的多线程应用程序中,我尝试使用curl(使用openssl)来执行HTTPS请求。

我已根据此信息阅读并完成所有内容:

应用程序与SEGFAULT 11和下一个调用堆栈崩溃:

  来自/lib/x86_64-linux-gnu/libcrypto.so.1.0.0的X509_STORE_add_lookup()中的

#0 0x00007f62446014d0    来自/lib/x86_64-linux-gnu/libcrypto.so.1.0.0的X509_STORE_load_locations()中的#1 0x00007f62445fa49f
   #2 0x00007f6246a268c5在? ()/usr/lib/x86_64-linux-gnu/libcurl.so.4
   来自/usr/lib/x86_64-linux-gnu/libcurl.so.4的Curl_ossl_connect()中的#3 0x00007f6246a27b15
   来自/usr/lib/x86_64-linux-gnu/libcurl.so.4的Curl_ssl_connect()中的#4 0x00007f6246a3b0b9
   来自/usr/lib/x86_64-linux-gnu/libcurl.so.4的Curl_http_connect()中的#5 0x00007f6246a11f80
   来自/usr/lib/x86_64-linux-gnu/libcurl.so.4的Curl_protocol_connect()中的#6 0x00007f6246a22bea
   来自/usr/lib/x86_64-linux-gnu/libcurl.so.4的Curl_setup_conn()中的#7 0x00007f6246a22e9a
   来自/usr/lib/x86_64-linux-gnu/libcurl.so.4的Curl_connect()中的#8 0x00007f6246a22f44
   #9 0x00007f6246a2e2a1在? ()/usr/lib/x86_64-linux-gnu/libcurl.so.4
   #10 - 这是我的代码curl_easy_perform(curl);

更重要的是,我找到了curl multithread example并且它也崩溃了,使用了SEGFAULT和相同的调用堆栈:

  来自/lib/x86_64-linux-gnu/libcrypto.so.1.0.0的X509_STORE_add_lookup()中的

#0 0x00007fe954d454d0
   来自/lib/x86_64-linux-gnu/libcrypto.so.1.0.0的X509_STORE_load_locations()中的#1 0x00007fe954d3e49f
   #2 0x00007fe955d1f8c5在? ()/usr/lib/x86_64-linux-gnu/libcurl.so.4
   来自/usr/lib/x86_64-linux-gnu/libcurl.so.4的Curl_ossl_connect()中的#3 0x00007fe955d20b15
   来自/usr/lib/x86_64-linux-gnu/libcurl.so.4的Curl_ssl_connect()中的#4 0x00007fe955d340b9
   来自/usr/lib/x86_64-linux-gnu/libcurl.so.4的Curl_http_connect()中的#5 0x00007fe955d0af80
   来自/usr/lib/x86_64-linux-gnu/libcurl.so.4的Curl_protocol_connect()中的#6 0x00007fe955d1bbea
   来自/usr/lib/x86_64-linux-gnu/libcurl.so.4的Curl_setup_conn()中的#7 0x00007fe955d1be9a
   来自/usr/lib/x86_64-linux-gnu/libcurl.so.4的Curl_connect()中的#8 0x00007fe955d1bf44
   #9 0x00007fe955d272a1在?? ()/usr/lib/x86_64-linux-gnu/libcurl.so.4
   位于../src/Main.cpp:124的pull_one_url(url = 0x44cac4)中的#10 0x000000000044251d    来自/lib/x86_64-linux-gnu/libpthread.so.0的start_thread()中的#11 0x00007fe955001e9a
   来自/lib/x86_64-linux-gnu/libc.so.6的clone()中的#12 0x00007fe95530b3fd
   #13 0x0000000000000000 in ?? ()

我的系统: Ubuntu 12.04 x64,OpenSSL 1.0.1 GCC 4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)

UPD1:
在逐行删除所有代码后,我发现我的应用程序(以及CURL示例,我在主函数之前添加了代码)在下一个代码存在时崩溃(即使它不是从任何地方调用的!!!):< / p>

#include "openssl/md5.h"
char* MD5_dcsadcsa(char* dest, const char* src, size_t length)
{
    unsigned char result[MD5_DIGEST_LENGTH];
    ::MD5((unsigned char*) src, length, result);
    for(int i = 0; i < MD5_DIGEST_LENGTH; ++i)
        sprintf(&dest[2 * i], "%02x", result[i]);
    return dest;
}

g ++ -D_DEBUG -I / usr / include / boost -I / usr / include / mysql -O2 -ggdb -Wall -c -fmessage-length = 0 -MMD -MP -MF&#34; main.d&#34 ; -MT&#34; main.d&#34; -o&#34; main.o&#34; &#34;的main.cpp&#34;
g ++ -o&#34; app_backend&#34; main.o -lmysqlclient_r -lcurl -lgnutls-openssl
./app_backend

线程0,得到https://www.example.com/
线程1获得https://www2.example.com/
线程2获得https://www3.example.com/
线程3获得https://www4.example.com/
分段故障(核心转储)

UPD2:
使用MD5通话评论应用程序不会粉碎

//::MD5((unsigned char*) src, length, result);

1 个答案:

答案 0 :(得分:0)

我刚刚删除了 -lgnutls-openssl ,但它确实有效。
我在以前版本的应用程序中使用它只是为了计算md5校验和。