记一次帮朋友调试私服服务端的过程

记一次帮朋友调试私服服务端的过程

起因

因为游戏太老了,原公司早都没了,所以有很多奇怪的BUG。
服务端大概是这样的:
group端管理角色的创建,账号等等
gate端负责和玩家,group,game 3方通信
game端管理地图和脚本(为了热更新)

gate端负责和玩家通信,那么玩家切换地图会是gate通知game2,这玩家切换从game1切换到了game2。game1释放空间在地图上删除角色,然后game2分配角色堆内存。为了节省性能,只会定期统一写入或角色被移除的时候才会写到数据库(哪个game分配的角色,保存哪个game的数据),也就是说切换地图和下线。

bug出现了!
玩家在切换地图瞬间,用另外一个客户端踢掉自己,我们理一下服务端会做什么蠢事。

  1. game1通过gate通知game2有玩家过去了。
  2. game2建了角色模型,但是并没有和玩家真正建立关系,只是提前建了个模型,和把玩家信息读取到了。
  3. game1发现玩家掉线,保存当前副本数据,角色所在位置等等。game1角色删除。
  4. 现在game2上有个模型,事实上这个玩家是根本不在线的。玩家重新上线,读取数据还是刚才game1触发掉线时候的数据,发现还在game1,然后我们将游戏物品随便交易给任何人。
  5. 再次切换地图到game2去,游戏发现角色冲突,踢掉角色,保存game2的角色到数据库。
  6. 重新上线,我们发现物品又回来了,造成了回档。但是刚才在game1交易给别人的东西,别人也有,这不就可以一生二,二生四发财了吗?

处理方式

因为没有源码,所以使用游戏热更新脚本用了最low的办法,文件锁来处理。保证不会有冲突角色,如果有直接踢掉,根本不会让你有回档刷东西的可能。

更奇怪的BUG

过了两天,朋友告诉我,游戏内玩家很卡,无法正常使用物品。
开始我猜测会不会是我的文件锁和物品使用在一个线程上导致的阻塞。
我开始检查IO和网络吞吐量一一进行排查。甚至还让我朋友服务器换了硬盘,也没发现有好转。
最后发现,和这些都没关系,我的文件锁是完全单独的线程在工作。
无奈,掏出IDA,逆向game

根据游戏日志打点找到关键字,IDA搜索字符串,找交叉引用发现个奇怪的地方。
奇怪的BUG
清楚的看见GetTickCount和一个全局变量,再往下看就是栈变量和全局变量相减做比较0x0c8h(200)。很可疑,做比较用来干嘛?TAB进入伪代码
在这里插入图片描述
OK,这是个static的变量,如果相差<200直接返回,如果>200记录当前时间。怪不得玩家使用物品卡呢,哪里是卡啊,服务端根本没处理,这不就等于一秒只允许5个玩家使用物品吗,其他玩家等着下蛋。

处理方式

直接把这段限时给NOP掉了,再测试,OK,解决。

总结:虽然没有做过游戏开发,但是这几次帮朋友修私服BUG自己也学到了一些经验。比如那个回档BUG,希望我以后写的东西不会有这么迷的BUG。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没事干写博客玩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值