杯具的BUG。。。

      从上上个星期五开始我们的BUG杯具一直持续了六天。。。在新版本的那次大规模更新后,一百多个区里面就一个组服务器程序突然连续挂掉了好多次,重启的玩家们都淡定了 - -|||    主要是没有任何异常日志,我们当时的初步推测就是由于玩家造成某个特殊数据触发程序中的BUG。由于程序是直接消失掉,这和我们以前遇到的两次问题十分相似,以前是因为发给客户端的技能那个函数里面,栈上分配的缓冲区溢出了(不停地增加新技能的最终杯具- -)。所以基本上可以确定是溢出了。

      但是后来和小吉子在SVN上来来回回比对快10多次近快一个月的更新代码,看得人都要吐了,但啥敏感代码都没看出来。

      杯具继续中,而且一晚过后,一个新的区也出现了类似情况,让我们原来幻想的就是个别玩家出现异常数据的可能被幻灭了。这个情况和以前的还有不一样,有时候是运行好一段时间后,突然挂了,程序重启玩家连上,几分钟内又挂掉。所以推测,不是玩家数据本身有问题,所以不是玩家上线就挂了,而是做了某个操作后才引发的。重启后,玩家又继续了该操作。

      由于加各种异常捕获的版本也没有用,所以我们最终决定把WINDBG挂到了公服程序上,结果第一晚上虽然杯具又继续了,可不是我们监控的那两个区组,是一个新的区组。中间两天又捕获了一些异常,当时很兴奋以为找到问题,结果发现是程序中埋藏的一个特殊情况下的空指针 - -||| 代码中的坑还是有不少的啊。

      终于在我们都有觉悟再找不到周末继续加班后,神奇般的又捕获了一个新的BUG。刚看的时候以为又是一个空指针,后来看到了函数下也分配了一个数据空间变量,就估计是这个问题了。这个是差不多两个多月前写的新交易系统,这个函数是查询历史交易信息。这个东西在我们游戏的另一个版本中,运行了有一个多月了,虽然有点小的问题,但都修正才放到这个版本中。但由于这个版本里面,我们又推了一个新的游戏内容,涉及到了道具,然后我们发给客户端的道具信息大小扩展了一半。而当这两个版本的内容碰到一起后,如果玩家最近的12单交易都是满物品的或者总共只差两三个,则缓冲区大小溢出了。当时数组分配了10K的字节,所以中间偶尔看到这块代码时根本没觉得会有问题。而且这块的代码是2个月前提交的,就更难引起注意了。

      现在回忆起来,最大的问题就是我们的代码中在函数栈上分配的数组空间用作缓冲区的方法,确实还是有其固有的弊端的。如果是在堆上分配,则我们肯定可以用结构对应的大小,这样即使结构后来扩展,代码也会自动扩展缓冲大小。但这么做,也会导致程序做了太多次的内存分配的操作。。。。所以才有些常用地方就在栈上分配了空间,这样就是固定大小了。无论分配多大的空间,都是有可能在今后需求变动的情况下,空间不够。而这样的代码无疑都是埋下的地雷,“只要是有可能出问题的地方,就一定会出问题”-----这句话一点都没有错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值