加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

GCC 下局部优化关闭,兼解决libcurl之curl_easy_perform code 27

(2017-03-21 16:21:45)
在Gcc下经常会出现莫明其妙的问题。就此问题请教了一友人,得到的结论是,GCC在O3优化模式时有时会生成错误的代码,特别是在no-omit-frame-pointer参数一起用时会导致栈错误之类问题。不幸的是,当使用vs studio的cross platform开发linux程序时,默认的优化参数就是这样的组合。在通常的小程序时,可能感觉不到啥问题。
我这次使用libcurl通过ssl 双向证书方式与服务器进行通讯。在debug模式下,一切正常,看起来很美好。 当转为release模式(无-g)时,优化参数改为O3, omit-frame-pointer. 在这个模式下会导致 libcurl之curl_easy_perform code 27,错误码27意思是out of memory, 但是实际上,libcurl把几个错误合并为一个,比如它在初始化ssl出错时,也报这个错,这时,get confused. 查了半天代码,一无所获。

后来实在没办法测试了普通的libcurl例子并没有发现啥问题。 此时,只好在工程参数上着手,根据以前的经验,应该是优化参数原因,对比debug模式,改为O0及no-omit-frame-pointer, 一切正常。 但是,作为一个senior programmer(老司机)啦,不能这样容忍自己的程序不优化执行。 经过跟友人讨论得知,可以进行局部去优化,方法如下:

#pragma GCC push_options
#pragma GCC optimize("O0")
#pragma GCC optimize("no-omit-frame-pointer")

// here, your own code...


#pragma GCC pop_options

这样就完全关闭了此段代码地优化,并关闭 omit-frame-pointer 优化。打开此优化也会导致局部变量问题。比如我的程序中,那个curl指针,如果放到函数中就有问题,放到类的成员变量中就没问题,初步推测也是因为frame pointer指针优化导致栈指针错误。

本着不怀疑编译器的想法,询问友人有没有可以改代码解决,答案是:改编译器代码(本质上是编译器的优化错误),好吧,不是编译器专家,只能忽略。

附图为友人的大法,解决gcc/win平台类似问题

http://s10/mw690/001wVhwmzy79G7iVDL379&690下局部优化关闭,兼解决libcurl之curl_easy_perform code 27" TITLE="GCC 下局部优化关闭,兼解决libcurl之curl_easy_perform code 27" />



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有