一个薛定谔的bug

来源:互联网 发布:景安备案域名出售 编辑:程序博客网 时间:2024/06/03 18:44

最近在维护公司原有项目的时候,遇到了一个无限循环的bug 。
初次遇到的时候,是刚刚接手这个项目,甚至怀疑自己是不是参数没有配置正确。 后来切换了运行服务器,重新编译后却正常运行了,也就没有再去追究(。。。囧。。。)。
老大分配的维护任务完成后,进行了基本的测试验证。觉得没问题了又回到了最初的服务器进行实际运行测试。起初我运行的DEBUG版本。 成功运行一遍之后,使用RELEASE 版本运行,结果又无限循环了:( 。

好, 让我来梳理下:

相同的数据参数,DEBUG 版本是好的,RELEASE版本是无限循环的。

所以只好先再RELEASE 下通过日志打印调试 , 并更多的关注变量未初始化之类的bug。
。。。
经过逐步定位,明确无限循环发生在一小段while循环内, 代码如下:

这里写图片描述

从外面代码,各种分析,都不可能无限循环,遂决定在while 内部添加printf .
然后!!! 无限循环消失了。。。

嗯。。。 我觉得我需要静静了。。。 这里有个bug, 但是不能观察它的运行情况,一观察就消失。。。 好像有个啥,对,好像薛定谔的那只猫啊。。。 这是一个薛定谔的bug

当然我没有办法拿这个搞笑词汇向老大交差,和静静厮混完毕。我整理了下思路, 决定先看看项目DEBUG 和RELEASE到底配置了什么区别 。(。。。囧。。。)

这里写图片描述

嗯。。。有个O3 。 让我在看看这个while 。嗯。。。这个指针操作有些拗口,不会给优化错了(这个服务器是个比较老的gcc版本)吧。。。 加个volatile 试试。
果然好了。
至此bug 本身讲的从理论上讲的通顺了:

这里写图片描述

——————————————————————————————

把这个bug将给小伙伴,小伙伴提醒我,将对应的汇编代码弄出来看看

汇编我也不是很懂。这里仅仅贴出来给大家看看。

没有volatile 的汇编代码:

这里写图片描述

添加了printf 之后,变的正确的汇编代码

这里写图片描述
修正后有volatile汇编代码
这里写图片描述