多線程中使用curl致coredump問題

來源:互聯網
上載者:User

多線程中使用curl致coredump問題
coredump時的調用棧:
#0 0x081eff2c in addbyter ()
#1 0x081f05b8 in dprintf_formatf ()
#2 0x081f15cf in curl_mvsnprintf ()
#3 0x081f0079 in curl_msnprintf ()
#4 0x081ef55c in Curl_failf ()
#5 0x081fa1a3 in Curl_resolv_timeout ()
#6 0xeb8fbdd4 in ?? ()
#7 0x00000000 in ?? ()


coredump的原因是因為curl的DNS解析逾時控制是使用SIGALARM實現的。
這樣導致發現SIGALARM會出現多線程修改同一個全域變數,由此產生了COREDUMP。
問題發生的前提是設定了CURLOPT_TIMEOUT或CURLOPT_CONNECTTIMEOUT,並且值不為0。


解決辦法:
1) 設定CURLOPT_NOSIGNAL的值為1
2) 使用c-ares(configure時指定參數--enable-ares)


lib/curl_setup.h(非同步模式使用c-ares控制DNS解析逾時):
只有當configure時指定了--enable-ares才會定義USE_ARES。
#ifdef USE_ARES
# define CURLRES_ASYNCH
# define CURLRES_ARES
/* now undef the stock libc functions just to avoid them being used */
# undef HAVE_GETADDRINFO
# undef HAVE_GETHOSTBYNAME
#elif defined(USE_THREADS_POSIX) || defined(USE_THREADS_WIN32)
# define CURLRES_ASYNCH
# define CURLRES_THREADED
#else
# define CURLRES_SYNCH
#endif


lib/hostip.c(同步模式使用ALARM控制DNS解析逾時):
只有定義了CURLRES_SYNCH,才可能定義USE_ALARM_TIMEOUT。
#if defined(CURLRES_SYNCH) && \
defined(HAVE_ALARM) && defined(SIGALRM) && defined(HAVE_SIGSETJMP)
/* alarm-based timeouts can only be used with all the dependencies satisfied */
#define USE_ALARM_TIMEOUT
#endif


相關原始碼:


lib/asyn-ares.c:
Curl_resolver_getaddrinfo


lib/hostasyn.c(基於c-ares的非同步版本Curl_getaddrinfo):
Curl_resolver_getaddrinfo <-- Curl_getaddrinfo


從緩衝中找(hostip.c):
fetch_addr <-- Curl_resolv


hostip.c:
Curl_ipv4_resolve_r <-- Curl_getaddrinfo <-- Curl_resolv


hostip.c:
curl_jmpenv <-- sigaction(SIGALRM, alarmfunc)/sigsetjmp(curl_jmpenv) <- Curl_resolv_timeout <-


url.c:
Curl_resolv_timeout(hostname) <-- resolve_server <-- create_conn <-- Curl_connect


multi.c:
Curl_connect <--


transfer.c
Curl_connect <-- Curl_reconnect_request


url.c:
Curl_reconnect_request <-- Curl_do


multi.c:
Curl_do <-- multi_runsingle <-- curl_multi_perform <-- multi_socket <-- curl_multi_socket

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.