В моем многопоточном приложении я попытался использовать curl (с openssl) для выполнения HTTPS-запросов.Многопоточная программа сбоев по запросам HTTPS
Я прочитал и сделать все в соответствии с этой информацией:
- libcurl programming tutorial
- http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION
- Network Security with OpenSSL: Cryptography for Secure Communications
И приложение падает с 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);
Показать соответствующие части файла main.cpp. –
Установили ли вы статические блокировки OpenSSL? См. [Threads (3)] (https://www.openssl.org/docs/crypto/threads.html) в документах OpenSSL. – jww
Как вы скомпилировали свою программу и пример скручивания? –