一种不停服的热更新方法与流程

文档序号:17831607发布日期:2019-06-05 23:06阅读:2515来源:国知局
一种不停服的热更新方法与流程

本发明涉及服务器更新方法,特别是一种不停服的热更新方法。



背景技术:

游戏服务器通常都需要不间断对外提供服务,常规的游戏服务器会有周期性的维护,进行服务器升级以及修复一些优先级较低的bug,新游戏在进行一定规模测试的阶段,往往存在大量的问题,修复的方式也只能是停服重启。正式的线上环境要修复已知bug同样只能停服重启,或者任由低优先级bug存在。重启会影响用户体验,同时也影响游戏的运营数据。



技术实现要素:

为了解决现有技术存在的不足,本发明的目的在于提供一种不停服的热更新方法。本发明能够使得一些低优先级的bug也能够得到及时的处理,配合业务功能控制系统,可以在暂时关闭某些功能后在线修复bug,然后在线恢复业务,整个过程无须关闭服务器,做到不中断主要的游戏体验。

为实现上述目的,本发明的一种不停服的热更新方法,包括以下步骤:

将需要进行热补丁的可执行文件静态加载应用补丁库;

修复可执行文件;

修复后的可执行文件调用创建补丁库的接口,指明要修复的函数所在模块、函数相对于模块基地址的偏移地址以及新的函数地址;

使用补丁可执行文件中的新的函数替换原文件中的原函数。

进一步地,所述将需要进行热补丁的可执行文件静态加载应用补丁库的步骤,进一步包括,加载应用补丁库,生成的可执行文件;所述可执行文件,包括两个预留的内存页,分别为用于存放补丁数据的内存页和用于存放补丁代码的内存页。

进一步地,所述修复可执行文件的步骤,进一步包括,在修复可执行文件时,添加一个与原函数签名一致的新的函数,并在新的函数中修改存在的问题,新添加的函数编译后存放在预留的代码内存页中。

进一步地,所述修复可执行文件的步骤,进一步包括,引入额外的全局变量,全局变量遵守与新的函数编写相同的规则,并且全局变量存在放预留的数据内存页中。

进一步地,所述修复后的可执行文件调用创建补丁库的接口,指明要修复的函数所在模块、函数相对于模块基地址的偏移地址以及新的函数地址的步骤,进一步包括,

创建补丁库并根据传入的信息生成补丁文件,记录所指明的信息,同时将预留的数据代码页和内存代码页的二进制数据存入补丁文件。

更进一步地,所述使用补丁可执行文件中的新的函数替换原文件中的原函数的步骤,进一步包括,接收到需要应用补丁的指令后,调用应用补丁库的接口加载生产的补丁文件,将其中内存页和代码页装载到自身预留的内存页和代码页中,并解析其中的补丁信息,根据模块信息和相对偏移地址,重新计算出被补丁函数的地址,并将被补丁函数修改为jump指令,使其跳转到新的函数地址。

本发明提供的不停服的热更新方法,具有以下优点:

1、对开发商而言,无须重启服务器就能够及时修复已知的bug。

2、对于玩家而言,有问题的业务可能会受到影响,但是其他没有问题的业务仍可以体验。

3、对运维而言,整个补丁过程全透明,只需按照说明布置好补丁文件和执行相关的运维命令即可,不会引入额外的复杂度。

4、对于开发人员而言,制作补丁的过程大部分委托给相关的补丁库程序,只需遵守少量规则即可进行热补丁的开发工作,同时应用补丁的过程由补丁库全权负责,降低学习曲线。

本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。

附图说明

附图用来提供对本发明的进一步理解,并且构成说明书的一部分,并与本发明的实施例一起,用于解释本发明,并不构成对本发明的限制。在附图中:

图1为根据本发明的不停服的热更新方法流程图;

图2为根据本发明的创建补丁库和应用补丁库工作流程图。

具体实施方式

以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。

在本发明中,

补丁文件,是指由程序自动生成的一种自定义格式的二进制数据文件;

创建补丁库,是指用于生成补丁文件的dll库文件;

应用补丁库,是指用于加载应并用补丁文件的dll库文件;

hook,是一种挂钩技术,是指通过修改函数汇编代码,使其跳转到新的函数地址的一种方法。

其中,创建补丁库和应用补丁库是本方法的核心工作库,创建补丁库工作在修复过后的服务器进程中,目的在于提取相关的补丁二进制代码,以生成补丁文件。而应用补丁库则需要加载到补丁服务器进程中去,其功能在于加载补丁文件,解析其内容并实施热补丁的工作。

图1为根据本发明的不停服的热更新方法流程图,下面将参考图1,对本发明的不停服的热更新方法进行详细描述。

首先,在步骤101,发现问题并上报给相关的开发部门。

在步骤102,排查问题,确定问题出现的原因。

在步骤103,打开当前有问题的线上服务器源代码工程(注意此处的的源代码必须和即将被补丁的服务器程序完全一致),编写修复问题的代码,并调用创建补丁库的相关接口。

在步骤104,运行新的服务器程序,此时是工作在创建补丁模式下,创建补丁库会根据运行时的状态,自动创建应用于线上服务器的补丁文件。

在步骤105,将生产的补丁文件交付给运维相关人员。

在步骤106,运维按照预定的控制指令,控制线上服务器加载补丁文件。

在步骤107,线上服务器中的应用补丁库加载补丁文件并hook相关函数的地址,使其跳转到新的补丁代码中,应用完成后输出提示信息以反馈给运维。

在步骤108,公告问题得到修复。

图2为根据本发明的创建补丁库和应用补丁库工作流程图,下面将参考图2,对本发明的创建补丁库和应用补丁库工作流程进行详细描述。

首先,在步骤201,将需要进行热补丁的可执行文件静态加载应用补丁库。其中,应用补丁库的作用是提供一个patch接口,以便程序在接收到应用补丁指令时加载补丁和应用补丁。另外,加载应用补丁库后,最终生成的可执行文件会有两个预留的内存页,一个内存页用于存放补丁数据,另外一个内存页用于存放补丁代码。

在步骤202,修复可执行文件。具体为,在修复可执行文件时,不可直接修改原有的代码,修改方式为添加一个与原函数签名一致的新的函数,并在新的函数中修改存在的问题,新的函数编译后会存放在预留的代码内存页中。如需引入额外的全局变量,全局变量也须遵守与新的函数编写相同的规则,则全局变量会被存在放预留的数据内存页中。

在步骤203,修复后的可执行文件调用创建补丁库的createpatch接口,指明要修复的函数所在模块,函数相对于模块基地址的偏移地址,以及新的函数地址。创建补丁库跟根据传入的信息生成一个自定义的补丁文件,记录这些信息。同时将预留的数据代码页和内存代码页的二进制数据存入补丁文件。

在步骤204,使用补丁可执行文件中的新的函数替换原文件中的原函数。具体为,接收到需要应用补丁的指令后,调用应用补丁库的patch接口,其会加载步骤203中所生产的补丁文件,将其中内存页和代码页装载到自身预留的内存页和代码页中,并解析其中的补丁信息,根据模块信息和相对偏移地址,重新计算出被补丁函数的地址,并将被补丁函数的前5个字节(32位程序)修改为一条jump指令,使其跳转到新的函数地址。至此,原函数的调用将全部被新的函数执行过程所取代。

本发明的不停服的热更新方法,问题修复的整个过程中线上服务器一直处于工作状态,修复后的服务器将运行新的服务器代码。待到下一次游戏停服维护时可将线上服务器源码更新到修复后的状态,问题得到彻底修复。

本领域普通技术人员可以理解:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1