最令程序员毛骨悚然闻风丧胆的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大括弧外面,保持住它的内存不被释放