GCC O2编译的bug

最近对以前写的tcp网络库做吞吐量测试,gcc O1编译,运行效果很好,可以达到900MiB/s。

但是问题来了,当我用gcc O2选项编译网络库,程序一启动就core掉。

查看coredump文件,原因大概如下:

挂在g_pool.DoSomething();

但是在DoSomething()里, this != &g_pool;

非常诡异。


我对自己的程序还是很有信心,不会有stack或者heap溢出错乱:

不使用静态数组,只用容器;

只new但不delete,资源交给 UniquePtr   SharedPtr管理。


google之,有老外说O2的sibling-call优化有bug,禁用掉就可以。我试了一下,还是core掉。

于是开始用最笨的办法,比较O1和O2的区别,一个一个的加编译选项,看是哪个导致了core


最终发现了-fgcse,只要在-O2后面加上-fno-gcse,程序就好了


这个选项的具体含义不清楚,也没兴趣了解,反感linux。


其实是很想测windows下的吞吐量,我比较迷信IOCP。

无奈没有windows服务器,个人PC性能太差。

结果就发现了gcc编译优化的这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值