2014-03-27 1 views
0

В моем многопоточном приложении я попытался использовать curl (с openssl) для выполнения HTTPS-запросов.Многопоточная программа сбоев по запросам HTTPS

Я прочитал и сделать все в соответствии с этой информацией:

И приложение падает с Segfault 11 и следующий стек вызовов:

# 0 0x00007f62446014d0 в X509_STORE_add_lookup() из /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
# 1 0x00007f62445fa49f в X509_STORE_load_locations() из /lib/x86_64-linux-gnu/libcrypto.so .1.0.0
# 2 0x00007f6246a268c5 in ??() Из /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 3 0x00007f6246a27b15 в Curl_ossl_connect() из /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 4 0x00007f6246a3b0b9 в Curl_ssl_connect() из /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 5 0x00007f6246a11f80 в Curl_http_connect() из /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 6 0x00007f6246a22bea в Curl_protocol_connect() из /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 7 0x00007f6246a22e9a в Curl_setup_conn() из /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 8 0x00007f6246a22f44 в Curl_connect() от /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 9 0x00007f6246a2e2a1 in ??() из /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 10 - вот мой код с curl_easy_perform (curl);

Более того, я нашел curl multithread example и он выходит из строя тоже с Segfault и тот же стек вызовов:

# 0 0x00007fe954d454d0 в X509_STORE_add_lookup() из/Lib/x86_64-линукс-ГНУ/libcrypto .so.1.0.0
# 1 0x00007fe954d3e49f в X509_STORE_load_locations() из /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
# 2 0x00007fe955d1f8c5 in ??() Из /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 3 0x00007fe955d20b15 в Curl_ossl_connect() из /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 4 0x00007fe955d340b9 в Curl_ssl_connect() из /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 5 0x00007fe955d0af80 в Curl_http_connect() из /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 6 0x00007fe955d1bbea в Curl_protocol_connect() из /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 7 0x00007fe955d1be9a в Curl_setup_conn() из /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 8 0x00007fe955d1bf44 в Curl_connect() от /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 9 0x00007fe955d272a1 в ??() из /usr/lib/x86_64-linux-gnu/libcurl.so.4
# 10 0x000000000044251d в pull_one_url (url = 0x44cac4) at ../src/Main.CPP: 124
# 11 0x00007fe955001e9a в start_thread() из /lib/x86_64-linux-gnu/libpthread.so.0
# 12 0x00007fe95530b3fd в клоне() из /lib/x86_64-linux-gnu/libc.so. 6
# 13 0x0000000000000000 in ??()

Моя система: Ubuntu 12.04 x64, OpenSSL 1.0.1 GCC 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

UPD1:
После удаления весь мой код по строке Я обнаружил, что мое приложение (и пример CURL тоже добавил, что код перед основным func) раздавливается, когда следующий код существует (даже если он не вызывался нигде !!!):

#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 "main.d" -MT " main.d»-o "main.o" "main.cpp"
г ++ -o "app_backend" main.o -lmysqlclient_r -lcurl -lgnutls-OpenSSL
./app_backend

Thread 0, получает https://www.example.com/
Thread 1, получает https://www2.example.com/
тему 2, получает https://www3.example.com/
тему 3, получает https://www4.example.com/
Segme Неисправность ntation (ядро сбрасывали)

UPD2:
с MD5 вызова прокомментировал приложение не раздавить

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

Показать соответствующие части файла main.cpp. –

+1

Установили ли вы статические блокировки OpenSSL? См. [Threads (3)] (https://www.openssl.org/docs/crypto/threads.html) в документах OpenSSL. – jww

+0

Как вы скомпилировали свою программу и пример скручивания? –

ответ

0

Я только что удалили -lgnutls-OpenSSL и она работает.
Я использовал его в предыдущей версии приложения только для caclulating контрольной суммы md5.