博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记一次帮朋友调试私服服务端的过程
阅读量:4109 次
发布时间:2019-05-25

本文共 1191 字,大约阅读时间需要 3 分钟。

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

起因

因为游戏太老了,原公司早都没了,所以有很多奇怪的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。

转载地址:http://bxlsi.baihongyu.com/

你可能感兴趣的文章
pytorch
查看>>
pytorch(二)
查看>>
pytorch(三)
查看>>
pytorch(四)
查看>>
pytorch(5)
查看>>
pytorch(6)
查看>>
opencv 指定版本下载
查看>>
ubuntu相关
查看>>
C++ 调用json
查看>>
nano中设置脚本开机自启动
查看>>
动态库调动态库
查看>>
Kubernetes集群搭建之CNI-Flanneld部署篇
查看>>
k8s web终端连接工具
查看>>
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
手绘VS码绘(二):动态图绘制(码绘使用Processing)
查看>>
基于P5.js的“绘画系统”
查看>>
《达芬奇的人生密码》观后感
查看>>
论文翻译:《一个包容性设计的具体例子:聋人导向可访问性》
查看>>
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>