网络游戏服务器陷入死循环的处理方法

文档序号:6537694阅读:941来源:国知局
网络游戏服务器陷入死循环的处理方法【专利摘要】网络游戏服务器陷入死循环的处理方法,首先检测死循环,当判定主线程陷入死循环后,监护线程就将主线程挂起,使它暂时停止运行。在主线程的Lua语言程序陷入死循环后,通过监护线程的处理,主动触发Lua的运行时错误,让它中止运行,然后跳回到C/C++里,这样就从死循环中解脱出来,然后通过一些后续处理,来避免再运行相同的代码,从而避免再次陷入死循环。本发明提供一种稳定有效的网络游戏服务器陷入死循环后的处理方法。【专利说明】网络游戏服务器陷入死循环的处理方法【【
技术领域
】】[0001]本发明属于计算机软件【
技术领域
】,具体是指一种使用脚本的网络游戏服务器陷入死循环的处理方法。【【
背景技术
】】[0002]在软件架构里,很基本的一个模式就是Client/Server模式,Client端用于显示数据和响应操作,而Server负责为所有的Client端服务器:下发数据和响应上发的消息。网络游戏的实现也是这样一种典型的架构,Client端就是游戏客户端,玩家在客户端显示的虚拟世界里进行游戏,而Server端就是游戏服务器,负责下发玩家的信息和同步其它的玩家。[0003]如果游戏服务器代码有问题,程序运行过程中出现死循环,那它就再也不能处理客户端的连接和消息包,所有的客户端就都不能进行游戏了。这对几千人、几万人在线的游戏来讲是致命的。目前游戏行业的服务器,都是通过提高代码质量、大量进行测试来防止出现死循环,而一旦出现死循环,就只能重启服务器程序了。而维护服务器的人不可能一天24小时就呆在服务器旁边,所以经常发生服务器出问题后,过了好久才将服务器重启的情况。这给游戏的运营,带来了很不好的影响。[0004]有鉴于此,本发明人针对现有技术的缺陷深入研究,遂有本案产生。【【
发明内容】】[0005]本发明所要解决的技术问题在于提供一种稳定有效的网络游戏服务器陷入死循环的处理方法。[0006]本发明是这样实现的:[0007]网络游戏服务器陷入死循环的处理方法,包括如下步骤:[0008]第一步骤:死循环的检测:[0009]在主线程处理消息前,将这个消息的唯一id、类型和当前时刻记录下来,保存在一个可多线程访问的结构类型的数据里,然后调入到Lua里对这个消息进行处理,处理完后回到C++里时,再将这些信息清空;监护线程以固定的频率来检测这些信息的处理情况,不同的消息通过消息的唯一id来标识,如果每次检测时,发现都是在同一个消息的处理状态中,并且处理时间已经超过了最大值,那么就判断陷入了死循环;[0010]第二步骤:死循环的恢复:[0011]当判定主线程陷入死循环后,监护线程就将主线程挂起,使它暂时停止运行,然后取得Lua实例,就是lua_State对象,然后通过Lua库的接口,取得当前的运行堆栈,记录到日志中,方便查出到底是哪里的代码引起了死循环;然后取得Lua实例中的_6全局变量,将_G这个table中的所有变量和函数,移到另外一个新建的table,清空_G变量里的数据;然后监护线程将主线程设置为进入“Lua死循环错误状态”,然后再恢复主线程的运行,当主线程里的Lua代码访问到_G里的变量或函数,会触发Lua错误,就会跳回到C++里,主线程就成功地从死循环中跳出来了;跳回到C++里后,检测到当前是“Lua死循环错误状态”,就将Lua中的_G_BACKUP存储的变量和函数取出,设置回_G全局变量中,就恢复了Lua的正常运行环境。[0012]进一步地,所述监护线程将Lua实例中的_6变量清空的同时,会记录下当前处理的消息类型,然后当主线程恢复到正常运行状态时,如果有客户端又上发了这个类型的消息,服务器将会丢弃这个消息而不再处理。[0013]本发明的优点在于:这是一种比较通用的主动使脚本语言触发运行错误的方法,只要一个脚本语言有一个类似Lua里的_G全局表的变量,就可以使用这种方法。使用这个方法后,服务器再也没有发生过陷入死循环后,所有玩家都不能进行游戏的事情了,服务器更加稳定,不用担心服务器忽然在什么时候又出问题了。【【具体实施方式】】[0014]程序一旦陷入死循环,基本上无法恢复,除非重启进程,特别是像C/C++这样的中低级语言开发的程序。游戏服务器由于逻辑比较复杂,所以一般会接入脚本进行开发,本发明项目里使用的就是Lua脚本。除了框架代码,所有的游戏逻辑功能,都使用Lua语言开发。Lua这样的脚本语言有一个特征,就是运行时如果发生错误,会跳到从C/C++调到Lua的初始地方,而不是像C/C++那样,遇到运行错误程序就直接崩溃退出了。本发明技术方案的核心思想,就是在Lua语言程序陷入死循环后,主动触发它的运行时错误,让它中止运行,然后跳回到C/C++里,这样就从死循环中解脱出来,然后通过一些后续处理,来避免再运行相同的代码,从而避免再次陷入死循环。[0015]本发明共涉及到两个线程,一个线程就是游戏服务器的主线程,负责处理所有客户端的消息,另一个线程起监视和协助的作用。[0016]具体实现方式如下:[0017]一、对死循环的检测:[0018]在主线程处理消息前,将这个消息的唯一id、类型和当前时刻记录下来,保存在一个可多线程访问的结构类型的数据里,然后调入到Lua里对这个消息进行处理,处理完后回到C++里时,再将这些信息清空,表示已经完成了对这个消息的处理。如果在Lua语言里,对这个消息的处理过程中,陷入了死循环,那将不能正常地回到C++里,这时这些信息就会一直保持调入到Lua前的状态。另外一个线程,就是监护线程,以固定的频率(比如I分钟一次),来检测这些信息的处理情况,不同的消息通过消息的唯一id来标识,如果每次检测时,发现都是在同一个消息的处理状态中,并且处理时间已经超过了最大值,那么就判断陷入了死循环,然后就启动对死循环的恢复操作。对应的部分伪代码如下:[0019][0020]【权利要求】1.网络游戏服务器陷入死循环的处理方法,其特征在于:包括如下步骤:第一步骤:死循环的检测:在主线程处理消息前,将这个消息的唯一id、类型和当前时刻记录下来,保存在一个可多线程访问的结构类型的数据里,然后调入到Lua里对这个消息进行处理,处理完后回到C++里时,再将这些信息清空;监护线程以固定的频率来检测这些信息的处理情况,不同的消息通过消息的唯一id来标识,如果每次检测时,发现都是在同一个消息的处理状态中,并且处理时间已经超过了最大值,那么就判断陷入了死循环;第二步骤:死循环的恢复:当判定主线程陷入死循环后,监护线程就将主线程挂起,使它暂时停止运行,然后取得Lua实例,就是lua_State对象,然后通过Lua库的接口,取得当前的运行堆栈,记录到日志中,方便查出到底是哪里的代码引起了死循环;然后取得Lua实例中的_6全局变量,将_G这个table中的所有变量和函数,移到另外一个新建的table,清空_G变量里的数据;然后监护线程将主线程设置为进入“Lua死循环错误状态”,然后再恢复主线程的运行,当主线程里的Lua代码访问到_G里的变量或函数,会触发Lua错误,就会跳回到C++里,主线程就成功地从死循环中跳出来了;跳回到C++里后,检测到当前是“Lua死循环错误状态”,就将Lua中的_G_BACKUP存储的变量和函数取出,设置回_G全局变量中,就恢复了Lua的正常运行环境。2.如权利要求1所述的网络游戏服务器陷入死循环的处理方法,其特征在于:所述监护线程将Lua实例中的_6变量清空的同时,会记录下当前处理的消息类型,然后当主线程恢复到正常运行状态时,如果有客户端又上发了这个类型的消息,服务器将会丢弃这个消息而不再处理。【文档编号】G06F11/07GK103810053SQ201410050333【公开日】2014年5月21日申请日期:2014年2月14日优先权日:2014年2月14日【发明者】刘德建,陈宏展,郭锐,陈南申请人:福建天晴数码有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1