前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程中使用curl致coredump问题

多线程中使用curl致coredump问题

作者头像
一见
发布2018-08-02 09:57:25
2K0
发布2018-08-02 09:57:25
举报
文章被收录于专栏:蓝天

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/03/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档