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

你可能感兴趣的:(libcurl)