libcurl使用问题

今天遇到一个libcurl的使用问题,为了找到原因,花了不少功夫,因此特意记录下来,并且记住这个教训,避免以后再次出现这个问题。其实问题原因很简单,但是定位花了很长时间。

问题描述:用libcurl的easy接口往一个地址post数据,我就google了一下libcurl的使用,找了一个代码来借鉴,大致是这样的

curl_easy_init();
curl_easy_setopt(...);
curl_easy_setopt(...);

curlCode = curl_easy_perform(curl);

<span style="color:#ff0000;">int statusCode;</span>
curlCode = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &statusCode);
...

写完后,在本地机器跑的没有问题。但是部署到测试机上时,一跑就出core。于是我就在开发机上调试找bug(一般必现的问题比较好找):

1.gdb 调试,发现最后调用是在std::string.assign()上面。找找看是否因为string生命期的问题,没有找到。

2.单步,发现乱跳。查Makefile,发现编译时使用-O2。去掉优化,这时奇怪了,程序不挂了。难道优化还能优化出问题?绝不会!一定是代码问题或者库问题。

3.加上-O2,代码一行一行注释。(有时候,这种土办法很有效),终于发现问题原因。在curl_easy_getinfo(curl, CURL_RESPONSE, &statusCode)上,函数的说明上特别强调第三个参数必须是long*, 或char*等等。英文说明还将MUST大写来强调。可是我借鉴的代码用的是int型的statusCode。我根本没有想到问题在这里。一开时,还以为是回调,同步问题,方向错了。


将statusCode改成long后,问题解决。


总结:

1.网上借鉴代码一定要慎重,至少要将所用库的函数原型对照下,不要犯这种低级且难找的错误。

2.使用开源库,一定要多看看函数说明,往往官方示例靠谱的多。网友的例子要慎重,往往有很多细微的错误会误大事。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值