这几天被程序的一个BUG搞得简直疯狂,我来大致描述一下这个BUG:
自己的回合先把卡牌拖到中间位置:,然后结束回合
下一回合将卡牌拖到前一个位置:,然后结束回合,第一张卡牌竟然就消失了!!但是对面的卡牌依然能被攻击,这说明这张卡牌在数据上是存在的!!只是图片,还有它的攻击特效全都消失了!!
我当时考虑的是不是被其他东西覆盖了,但是设置了ZOrder依旧没有解决问题...然后发现能覆盖它的只有背景,就干脆把背景去掉,但是图片还是会消失...
问题是只有这样图片才会消失,其他拖动顺序都不会消失,我用了各种方法:设置断点、输出......
结局就是开始怀疑是不是cocos自己的问题
在一次偶然的尝试下,我发现了BUG竟然在一个自认为对图片没有影响的地方。修改好逻辑后问题就解决了,所以决定将自己的调试经验写下来。
一:学会输出
2dx提供了一个输出的方法,CCLOG(msg);,另外vs2012也有自己的输出方法,Debug.WriteLine(msg);
这是一个非常重要的功能,如果在程序的一些重要的步骤里加入输出,那么在操作程序的时候vs会不断输出你要的结果,可以定位程序执行到哪里,当然也能定位是哪里出错。
二:学会设置断点
如果程序比较简单,可以不输出直接设置断点,然后一步步执行,但是如果程序量很大,那么直接设置断点就不明智了。
我认为应该先用输出的方法定位程序出错的位置,然后再在此处设置一个断点,经行一步步的测试,找出错误。
三:学会注释
对于一些特殊情况,可能断点或者输出也无法找到出错的位置,那么现在可以选择用一些手动的方法。
注释是一个比较考验经验的方法,首先要对自己写的程序非常了解才行,
比如有两个先后执行的函数或者步骤,我们先把一个注释掉(前提是注释了它程序还是可以正常执行),如果问题依旧存在那么注释另一个地方,如果问题不存在了那就说明问题出在了注释的区域内。我上面的问题就是用这种方法解决的。
四:其他
建议在写一个比较完整项目的时候写一个进度文档,将自己完成的程序模块名字按照顺序写在文档里,那么程序一旦出现问题就可以从下到上查找,一般能很快找到问题所在。这次正好偷了懒,新写的几个模块没有写到文档里,大大降低了寻找BUG的速度。
每种方法都有自己的优缺点,至于怎么去选择,这需要我们在实际项目中积累经验。
另外程序的BUG原因五花八门,让人头疼的是它经常会出现在各种不经意的地方,所以我建议查找BUG的时候要像个有头脑的“电脑”一样,除非显而易见正确的,我们都不要轻易跳过自认为正确的地方。
好了,以上就是这次惨痛经历的总结。。