Linux应用热补丁热升级的书,一种用于通信系统linux环境中的热补丁修复方法与流程...

b65317942027e307880cb39d9e0af0e4.gif

本发明涉及通信技术领域,尤其是涉及一种基于Linux系统的修复正在运行的进程的bug的方法。

背景技术:

在通信系统中,为确保通信服务的连贯,提供通信服务的程序要少重启和不中断服务,尽可能的做到7*24小时的运行。但是当服务程序出现bug(错误),需要修复的时候,传统的方法是用修复好的程序文件代替原来的程序文件来执行,这样不可避免的出现重启和服务中断。

使用热补丁技术可以避免服务中断。将修正bug的代码编译成一个小的补丁文件,在linux系统是编译成可动态加载的so(一种文件格式)文件,然后不中断服务让服务程序加载补丁文件,用补丁文件的代码替换掉有bug的代码。

目前主要的热补丁技术实现如下:

服务程序启动,正常提供服务;当需要打热补丁时,由一个打补丁程序读取补丁文件,解析补丁文件的符号表,然后attach(挂载)上服务程序,将解析后的补丁文件写到服务程序的内存中,最后修复服务程序的bug。

使用这种打补丁的方法,由打补丁程序来解析补丁文件,操作会比较麻烦,同时也容易出错。另外,由于attach服务程序会导致服务暂停,因此打补丁程序解析补丁文件会导致服务暂停的时间比较长。

技术实现要素:

针对现有技术缺陷,本发明提供了一种新的用于通信系统linux环境中的热补丁修复方法。

本发明的技术方案为一种用于通信系统linux环境中的热补丁方法,设置用于修正程序bug的热补丁为能够动态加载的so文件;已启动的服务程序加载热补丁文件后,进行热补丁操作,

加载热补丁文件过程包括以下子步骤,

步骤1.1,服务程序已运行;

步骤1.2,向服务程序发送命令,服务程序收到命令后,将补丁的so文件加载到内存空间内;

之后执行热补丁操作,打补丁的过程包括以下子步骤,

步骤2.1,启动打补丁程序,打补丁程序通过系统调用挂载上服务程序;

步骤2.2,在服务程序的内存空间里查找补丁内的函数和将要被替换的函数的地址;

步骤2.3,计算出补丁内的函数和将要被替换的函数的地址的差值,在将要被替换的函数的地址处写入jmp命令,使得访问此函数时,跳转到补丁函数。

而且,服务程序内部有一个独立的线程,负责接收并处理工具程序发送的命令;此线程不参与也不影响程序正常的业务处理。

而且,打补丁程序挂载上服务程序后,能够直接访问服务程序的内存空间。

该方法能在linux系统中实现对正在运行的进程打热补丁,修正程序的bug;同时能比较方便地解析补丁文件,减少因为attach服务程序导致的服务中断时间。

本发明对比已有技术有以下创新点:

1、服务程序来解析补丁文件,能减少attach服务程序导致服务暂停的时间,减少打补丁对正常服务造成的影响。

2、进一步地,服务程序用独立的task接收用户输入的命令,这样让服务程序来load补丁文件,降低了load和解析补丁文件的复杂度。

本发明技术方案将在大型通信系统中发挥重要作用,具有重大的市场价值。

附图说明

图1为现有热补丁技术的传统方法示意图;

图2为本发明实施例的热补丁方案示意图。

图3为本发明中服务程序的intershell task功能示意图。

具体实施方式

以下结合附图和实施例详细说明本发明技术方案,提供了对该实施例的全面理解的详细细节。

对于热补丁技术,首先将用来修复bug的代码编译成so文件,传统的方法是由打补丁程序来解析补丁文件,并写到服务程序的内存空间里,如图1所示:

打补丁程序Attach服务程序,之后服务程序暂停执行;

解析补丁文件;

将解析后的补丁文件写到服务程序的内存空间;

在服务程序的内存空间中查找bug函数和补丁函数的地址;

在bug函数的位置写入jmp命令;

打补丁结束,服务程序恢复执行。

这样解析补丁文件比较复杂,同时暂停服务程序执行的时间也会比较长;本发明提出由服务程序来解析补丁文件,降低解析的复杂度,同时减少服务暂停的时间。

本发明实施例设置用于修正程序bug(错误)的热补丁为可动态加载的so(一种文件格式)文件;需要打补丁的程序(服务程序)已启动,在服务程序加载热补丁文件后,进行热补丁操作。

加载热补丁文件过程包括以下子步骤,

步骤1,1,服务程序已运行;

步骤1.2,向服务程序发送命令,服务程序收到命令后,在不影响自身业务的情况下,将补丁的so文件加载到本进程的内存空间内;

之后执行打补丁的操作,打补丁的过程包括以下子步骤,

步骤2.1,启动打补丁程序,打补丁程序通过ptrace(系统调用)attach(挂载)上服务程序;

步骤2.2,在服务程序的内存空间里查找补丁内的函数和将要被替换的函数的地址;

步骤2.3,计算出2个地址的差值,在将要被替换的函数的地址处写入jmp命令,使得访问此函数时,跳转到补丁函数。

如图2所示,实施例具体实施过程如下:

1.首先将用于修复服务程序bug的代码编译成so文件,这里要注意修复bug的代码里用的全局变量要是extern(c语言关键字)的,这样load(加载)到服务程序的内存后才能访问服务程序原有的全局变量,否则是新建了一个同名的全局变量。

2.启动工具程序,向服务程序发送loaddllfile(加载动态文件)命令,命令参数是补丁so文件的文件名。服务程序收到命令后,将补丁so文件load(加载)到自己的内存空间里并解析。

具体实施时,加载热补丁文件过程可以包括运行服务程序,向服务程序发送命令,服务程序收到命令后,在不影响自身业务的情况下,将补丁的so文件加载到本进程的内存空间内。

这里服务程序要支持接收用户的命令。本发明进一步提出,服务程序内部有一个独立的线程,负责接收并处理工具程序发送的命令;此线程不参与也不影响程序正常的业务处理。

实施例中,服务程序内部有一个task(图3中的Intershell task)专门负责接收和处理工具程序发送的命令,此task与工具程序通信,等待用户发送的命令消息。用户通过工具程序发出命令。每个命令对应一个命令处理函数。Intershell task收到命令后,如果支持此命令,则执行此命令的命令处理函数。

其中,Intershell为接收工具程序命令的线程名,task表示线程,Intershell task负责接收工具程序发送的命令,收到命令后执行对应的函数。实施例中采用loaddllfile命令,loaddllfile命令的命令函数功能是将指定的文件load到内存空间并解析。Intershell task接收到工具程序发送的loaddllfile命令后,能将命令指定的so文件加载到服务程序的内存空间中。

参见图3,服务程序的Intershell task执行以下过程:

等待用户发送的命令消息;

解析命令消息,查找命令名对应的命令执行函数;

执行对应命令的命令执行函数;

向用户程序返回命令执行结果。

进一步地,实施例使用系统调用dlopen(系统调用)load so文件到进程的内存文件,使用RTLD_NOW(dlopen的一个参数)模式,这样在不影响服务程序的功能前提下,完成补丁文件的解析。

3.打补丁程序attach上服务程序,暂停服务程序的执行,在服务程序的内存空间里查找bug函数和补丁函数的地址,计算两者的相对地址,在bug函数的地址出写入jmp(跳转)命令,跳转到补丁函数的地址。

打补丁程序attach上服务程序后,可以直接访问服务程序的内存空间。

实施例中,打补丁程序使用ptrace(一个系统调用)attach上服务程序,attach成功后,服务程序会被暂停,打补丁程序可以访问服务程序的内存空间。之后,打补丁程序在服务程序的内存空间内查找bug函数和补丁函数的地址:

3.1.如果没有查到地址,则打补丁失败;

3.2.如果查找到地址,用补丁函数的地址减去bug函数的地址,计算出相对地址addr,然后在bug函数的首地址写入命令jmp addr-5,减去5是因为要减去jmp命令本身的长度。这样当执行到bug函数的时候,通过jmp命令跳转到了补丁函数。

4.打补丁程序detach(停止挂载)服务程序,热补丁过程结束。此时服务程序恢复执行,bug函数已经被补丁函数替换,bug被修复。

实施例中,打补丁使用ptrace detach服务程序,之后服务程序恢复业务执行。并且,bug函数被补丁函数替换。打补丁完成。

具体实施时,本发明所提供方法可采用软件技术实现自动运行。

本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值