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. rem 响应 js函数

    size();window.onresize = function(){ size();}function size(){ var htnl_o=document.getElementsByTagNa ...

  2. Nginx_status显示结果详解

    打开:http://aabb.com/nginx_status会有如下显示Active   connections: 2872server   accepts  handled requests294 ...

  3. TEXT 15 A text a day...

    TEXT 15 A text a day... Mar 24th 2006 From The Economist print edition The medical uses of mobile ph ...

  4. ASP.NETAutocomplete control

    分享一个Ajax autocomplete control, 原文链接:http://forums.asp.net/t/1157595.aspx 首先,引入ScriptManager <asp: ...

  5. pycharm 远程开发

    1. 服务器安装图形化 和 pycharm 本地使用 MobaXterm 工具登陆 session配置 勾选 x11-forwarding 运行pycharm.sh 2. 本地pycharm 远程服务 ...

  6. DES_3DES_AES_IDES_RSA密码算法比较

    对称加密算法(也叫共享密钥) 类型 定义:发送接收使用相同的对称密钥 密钥 长度 分组长度 循环次数 安全性 DES 数据加密标准,速度较快,适用于加密大量数据的场合: 56 64 16 依赖密钥受穷 ...

  7. webdriver简介及浏览器的驱动

     1.webdriver概述:  webdriver(selenium2=selenium1+webdriver)是一种用于web应用程序的自动化测试工具,它提供了一套友好的API,与selenium ...

  8. scrollLeft滚动(用animate替代)

    原: let checkedLeft1 = $('#dateBox').find('.checked').position().left let checkedLeft2 = $('#dateBox' ...

  9. SQL SERVER 和ACCESS、EXCEL的数据导入导出

    SQL SERVER 与ACCESS.EXCEL之间的数据转换SQL SERVER 和ACCESS的数据导入导出[日期:2007-05-06]     来源:Linux公社  作者:Linux 熟 悉 ...

  10. linux-git服务搭建

    第一步,安装git: 源码安装参考:http://www.cnblogs.com/syuf/p/9151115.html 第二步,创建一个git用户,用来运行git服务: $ sudo adduser ...