如果 在使用libcurl 出现崩溃找不到原因,curl_easy_cleanup() 崩溃的一种情况,不妨改成下面试试:
int info; // 错误,崩溃
long info; //不崩溃
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &info);
原因在于,info 这个数据类型是 long 类型,在网上很多例子,这里定义成 int 类型,导致大家不注意这点细节,直接拿过来用,就崩溃了。
当多个线程,同时进行
curl
_
easy
_init时,由于会调用非线程安全的
curl
_global_init,因此导致
崩溃
。
应该在主线程优先调用
curl
_global_init进行全局初始化。再在线程中使用
curl
_
easy
_init。
/***************************************************************************...
1. 问题定位
在使用
libcurl
时出现了段错误,经过调试发现出现的时机是在断网的
情况
下,为了保持网络的自动恢复我会在程序中重启网络节点 ifconfig eth0 down,如果这时正在用
libcurl
做 GET 请求或者 POST 请求等就会出现段错误
2. 分析出现原因
libcurl
在configure默认配置编译的
情况
下,它是使用alarm+siglongjmp实现域名解析超时。如果这个时候执行了 ifconfig eth0 downDNS解析会失败,然后 libcrl 会发出信号来打断等
用
libcurl
一段时间遇到莫名其妙的程序
崩溃
的
情况
,开会觉得是线程栈溢出导致的段错误,专门增加了线程栈的大小貌似无效。线程也是分离的。用valgrind定位到问题可能出现在
curl
的调用上。
排查的时候也发现了
libcurl
一些额外的坑,现做个总结笔记。
线程使用
libcurl
访问时,设置了超时时间,而
libcurl
库不会为这个超时信号做任何处理,信号产生而没有信号句柄处理,可能导
libcurl
库如果要静态链接,必须在调用
#incluce <
curl
/
curl
.h>前面添加 #define
CURL
_STATICLIB //静态链接
#define
CURL
_STATICLIB //静态链接
二、区分debug和release库
程序执行到
curl
_
easy
_perform这个函数就
崩溃
了,按F5继续运行,VS显示是异常,d...