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

多线程中使用curl致coredump问题的更多相关文章

  1. PHP中使用CURL实现GET和POST请求数据

    PHP中使用CURL实现GET和POST请求 一.什么是CURL? cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 ...

  2. php 中使用cURL发送get/post请求,上传图片,批处理

    cURL是利用url语法规定传输文件和数据的工具.php中有curl拓展,一般用来实现网络抓取,模拟发送get   post请求,文件上传. 在php中建立curl的基本步骤如下: 1 初始化     ...

  3. PHP中使用CURL请求页面,使用fiddler进行抓包

    在PHP中使用CURL访问页面: <?php $ch = curl_init('http://www.baidu.com'); curl_setopt($ch, CURLOPT_RETURNTR ...

  4. PHP中使用cURL实现Get和Post请求的方法

    1.cURL介绍  cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 cURL 库.本文将介绍 cURL 的一些高级特 ...

  5. c#初学-多线程中lock用法的经典实例

    本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被 ...

  6. iOS多线程中,队列和执行的排列组合结果分析

    本文是对以往学习的多线程中知识点的一个整理. 多线程中的队列有:串行队列,并发队列,全局队列,主队列. 执行的方法有:同步执行和异步执行.那么两两一组合会有哪些注意事项呢? 如果不是在董铂然博客园看到 ...

  7. php中的curl使用入门教程和常见用法实例

    摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...

  8. PHP中的CURL函数库

    PHP中的CURL函数库(Client URL Library Function) curl_close — 关闭一个curl会话curl_copy_handle — 拷贝一个curl连接资源的所有内 ...

  9. 解决DataGridView在多线程中无法显示滚动条的问题

    在多线程中对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的 ...

随机推荐

  1. linux查看网卡驱动

    [root@hudson ~]# yum install ethtool -y [root@hudson ~]# ethtool -i em1driver: bnx2version: 2.2.3fir ...

  2. EditorGUILayout,GUILayout

    bool active=EditorGUILayout.Toggle("active",_bodyObj.active);//bool类型 b2BodyType type=(b2B ...

  3. mysql 变量名称不能与表字段一致

    my sql的变量名称不能与表字段名称相同不然会有各种异常问题 啃爹

  4. L2tp协议简单解析

    1.L2TP简介 L2TP(Layer 2 Tunneling Protocol,二层隧道协议)是VPDN(Virtual PrivateDial-up Network,虚拟私有拨号网)隧道协议的一种 ...

  5. Ansible develop module

    def cnf(action,configs,path): message = "Modify %s\n" %path changed = False if action == & ...

  6. sdc docker连接

    curl -O https://raw.githubusercontent.com/joyent/sdc-docker/master/tools/sdc-docker-setup.sh &&a ...

  7. 团队作业4 Alpha冲刺

    第一天 日期:2018/6/13 1.今日完成任务情况以及遇到的问题 许征航:实现了推荐算法的基础逻辑,并按照模块化的思想对算法进行了分步整理. 遇到的问题:现有条件无法实现协同过滤算法,需要简化模型 ...

  8. jquery 判断checkbox是否被选中问题

    1.jquery库2以上 $("#checkbox_check").click(function(){ alert($(this).prop("checked" ...

  9. rabbitmq web管理界面 用户管理

    安装最新版本的rabbitmq(3.3.1),并启用management plugin后,使用默认的账号guest登陆管理控制台,却提示登陆失败. 翻看官方的release文档后,得知由于账号gues ...

  10. input disable手机端颜色兼容问题

    color: #5b636d; -webkit-text-fill-color: #5b636d; opacity: 1; -webkit-opacity: 1; input在移动端会有padding ...