捉虫记:一种令程序员闻风丧胆的BUG

最令程序员毛骨悚然闻风丧胆的BUG就是那种不可重现的bug。这种bug总是在你调试的时候无影无终,而用户使用的时候却又出现。

有以下两种情况:

1:)bug时而出现,时而消失,飘忽不定。这种bug以一种概率出现,所以当你企图调试代码找出它时,它又消失了。这种情况是最让人崩溃的!

2:)bug只在发行版中出现,调试版中却是正常的,但分析bug必须在调试版中。

以上两种bug几乎可以肯定都是内存照成的,线程同步问题、栈溢出问题都是这两种bug的根源。

昨天我的app: <6F> 上TestFlight内测,发现这样的bug, 自己运行都是正常的 ,但提交到TF后,下载下来用却有bug 

这是绘图工具里一个绘制多边形的场景。

自己开发的时候是这样的:




但发行版本中,用户使用的情况却是这样的:


这个bug只存在发行版中,并且多边形如果为正多边形的情况下,bug也消失。因为bug只存在发行版本中,几乎没办法代码调试,只能在几十万行代码中靠猜( 当然猜测的依据是历史所有经验的总结和汇总),然后在猜测的地方加log输出, 经过一天一夜的无水无食物无大小便的努力,找到bug


自己写的多边形算法里,是先绘制正多边形,然后再做压缩的矩阵。

问题是用到了trans这个变量的指针,但是trans局部变量的生命周期在if 的大括弧内,也就是说超过if大括弧,trans变量的内存就会被释放,然而,后面的代码中却使用了trans的数据。

那为什么在debug版本中是正常的呢?

因为debug版本的局部变量的内存释放,系统并不会说把这部分内存清为0, 只是把它丢弃掉,以后有可能有其他代码使用它,而release版本中,系统会立刻把这部分内存清为0.

当然修改起来也很简单,就是把tans变量的定义放到if大括弧外面,保持住它的内存不被释放


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容