CN118259952A - 应用程序热升级方法、系统、电子设备及存储介质 - Google Patents

应用程序热升级方法、系统、电子设备及存储介质 Download PDF

Info

Publication number
CN118259952A
CN118259952A CN202410383344.9A CN202410383344A CN118259952A CN 118259952 A CN118259952 A CN 118259952A CN 202410383344 A CN202410383344 A CN 202410383344A CN 118259952 A CN118259952 A CN 118259952A
Authority
CN
China
Prior art keywords
function
application program
upgraded
updated
upgrading
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202410383344.9A
Other languages
English (en)
Inventor
黄玉龙
仇锋利
张在理
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Suzhou Metabrain Intelligent Technology Co Ltd
Original Assignee
Suzhou Metabrain Intelligent Technology Co Ltd
Filing date
Publication date
Application filed by Suzhou Metabrain Intelligent Technology Co Ltd filed Critical Suzhou Metabrain Intelligent Technology Co Ltd
Publication of CN118259952A publication Critical patent/CN118259952A/zh
Pending legal-status Critical Current

Links

Abstract

本发明提供一种应用程序热升级方法、系统、电子设备及存储介质,涉及计算机技术领域,该方法包括:根据待升级应用程序的当前配置文件,获取待升级应用程序的当前版本号和当前函数清单列表;根据从目标控制系统的共享内存中加载的待升级应用程序的动态库升级文件和当前版本号,对当前配置文件的当前函数清单列表中的函数进行更新,并将更新的函数清单列表加载至待升级应用程序的进程空间中,并生成待升级应用程序的目标函数地址;通过进程跟踪系统,根据目标函数地址,对进程空间中待更新函数地址更新,以及根据更新的函数清单列表中的函数,对进程空间中的待更新函数更新。本发明实现应用程序的热升级,提高了应用程序升级的高效、安全和可靠。

Description

应用程序热升级方法、系统、电子设备及存储介质
技术领域
本发明涉及计算机技术领域,尤其涉及一种应用程序热升级方法、系统、电子设备及存储介质。
背景技术
随着信息技术的快速发展,应用程序承载了众多业务逻辑和功能需求,其为集中式双控系统等计算机系统中的核心组件,扮演着至关重要的角色。然而,随着业务需求的变化和技术环境的更新,应用程序的升级和维护成为了一项持续而必要的任务。
目前,应用程序的升级通常需要先停止应用程序的运行,再进行代码替换,然后再重新加载应用程序,以及启动进程,导致应用程序的业务长时间中断,进而使得应用程序升级的安全性和可靠性得到不到保障。
因此,亟需提供一种应用程序热升级方法、系统、电子设备及存储介质来解决上述技术问题。
发明内容
本发明提供一种应用程序热升级方法、系统、电子设备及存储介质,用以解决现有技术中应用程序升级时重启,容易产生业务中断和数据丢失的风险,降低了应用程序升级的安全性和可靠性的缺陷,实现应用程序的热升级,进而提高应用程序升级的高效、安全和可靠。
本发明提供一种应用程序热升级方法,包括:
从目标控制系统的共享内存中,加载所述目标控制系统中待升级应用程序的源升级文件对应的动态库升级文件;
根据所述待升级应用程序的当前配置文件,获取所述待升级应用程序的当前版本号和当前函数清单列表;
根据所述动态库升级文件和所述当前版本号,对所述当前函数清单列表中的函数进行更新,并将更新的函数清单列表加载至所述待升级应用程序的进程空间中,并生成所述待升级应用程序的目标函数地址;所述目标函数地址为所述更新的函数清单列表在所述进程空间中的函数地址;
通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新。
根据本发明提供的一种应用程序热升级方法,所述通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新,包括:
通过所述进程跟踪系统执行如下更新步骤:
向所述待升级应用程序所属组件的内核态中的系统调用模块发送更新请求;所述更新请求包括用于进行函数和地址更新的请求;
接收所述系统调用模块返回的响应信息;所述响应信息是由所述系统调用模块在接收到所述更新请求的情况下,根据所述更新请求,对所述待升级应用程序所属组件的用户态进行权限验证生成的;
在根据所述响应信息确定所述用户态通过权限验证的情况下,暂停运行所述进程空间中的代码;
向所述内核态发送地址更新指令,以供所述内核态在接收到所述地址更新指令的情况下,将所述目标函数地址替换到所述待更新函数地址所处的地址位上;
向所述内核态发送函数更新指令,以供所述内核态在接收到所述函数更新指令的情况下,根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数依次进行更新;
接收所述内核态通过所述系统调用模块返回的更新状态信息;
在根据所述更新状态信息,确定所述待更新函数地址更新完成,且所述待更新函数更新完成的情况下,恢复运行所述进程空间中的代码。
根据本发明提供的一种应用程序热升级方法,所述通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新,包括:
在所述待升级应用程序的数量为多个的情况下,从各所述待升级应用程序的当前配置文件中,解析获取各所述待升级应用程序的升级优先等级和依赖关系;
根据所述依赖关系和所述升级优先等级,确定各所述待升级应用程序的升级顺序;
按照所述升级顺序,依次调用各所述待升级应用程序的进程空间对应的进程跟踪系统,根据各所述待升级应用程序对应的目标函数地址,对各所述待升级应用程序的进程空间中的待更新函数地址进行更新,以及根据各所述待升级应用程序对应的更新的函数清单列表中的函数,对各所述待升级应用程序的进程空间中的待更新函数进行更新。
根据本发明提供的一种应用程序热升级方法,所述从目标控制系统的共享内存中,加载所述目标控制系统中待升级应用程序的源升级文件对应的动态库升级文件之前,包括:
通过动态库编译器,根据所述源升级文件编译生成至少一个目标文件,并对至少一个所述目标文件进行链接,得到所述动态库升级文件;
将所述动态库升级文件以共享动态库的形式存储至所述共享内存中。
根据本发明提供的一种应用程序热升级方法,所述根据所述动态库升级文件和所述当前版本号,对所述当前函数清单列表中的函数进行更新,包括:
将所述动态库升级文件的版本号与所述当前版本号进行匹配;
在所述动态库升级文件的版本号与所述当前版本号不匹配的情况下,将所述动态库升级文件中函数与所述当前函数清单列表中的函数进行匹配,得到与所述当前函数清单列表中的函数不匹配的目标函数;
根据所述目标函数,对所述当前函数清单列表中的函数进行更新。
根据本发明提供的一种应用程序热升级方法,所述从目标控制系统的共享内存中,加载所述目标控制系统中待升级应用程序的源升级文件对应的动态库升级文件,包括:
通过动态加载库函数,对所述共享内存中的共享动态库执行打开操作,并获取共享动态库的打开状态;
在根据所述打开状态,确定所述共享动态库已打开的情况下,通过函数指针,在所述共享动态库中,动态加载所述动态库升级文件。
根据本发明提供的一种应用程序热升级方法,所述待升级应用程序所属的组件包括目标控制系统中的控制节点、业务模块和集群管理器中的至少一项组件。
本发明还提供一种应用程序热升级装置,包括:
加载单元,用于从目标控制系统的共享内存中,加载所述目标控制系统中待升级应用程序的源升级文件对应的动态库升级文件;
解析单元,用于根据所述待升级应用程序的当前配置文件,获取所述待升级应用程序的当前版本号和当前函数清单列表;
更新单元,用于根据所述动态库升级文件和所述当前版本号,对所述当前函数清单列表中的函数进行更新,并将更新的函数清单列表加载至所述待升级应用程序的进程空间中,并生成所述待升级应用程序的目标函数地址;所述目标函数地址为所述更新的函数清单列表在所述进程空间中的函数地址;
升级单元,用于通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新。
本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述应用程序热升级方法。
本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述应用程序热升级方法。
本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上述任一种所述应用程序热升级方法。
本发明提供的应用程序热升级方法、系统、电子设备及存储介质,通过动态库动态加载动态库升级文件,并通过ptrace系统调用,依据动态库升级文件实现应用程序的函数级别的升级,一方面在秒级短暂等待时间后,达到秒级快速升级。极大地缩短了升级所需的时间,显著减少了业务中断时间,提高了系统的可用性;另一方面,针对函数级别的更新,而非整个应用程序,因此能够最大限度地减少对正在运行业务的影响,甚至可以达到对业务0影响;且升级过程中不需要重启应用程序或整个系统,因此能够进一步保持业务的连续性和稳定性,由此实现应用程序的热升级,进而提高应用程序升级的高效、安全和可靠。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明提供的应用程序热升级方法的流程示意图之一;
图2是本发明提供的Linux系统的计算机程序的结构示意图;
图3是本发明提供的双控系统的结构示意图;
图4是本发明提供的CPU指令集的结构示意图;
图5是本发明提供的用户态、系统调用、内核态和系统底层硬件之间关系的结构示意图;
图6是本发明提供的应用程序热升级方法的流程示意图之二;
图7是本发明提供的应用程序热升级装置的结构示意图;
图8是本发明提供的电子设备的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
目前,常规的应用程序的升级通常需要先停止应用程序的运行,再进行代码替换,然后再重新加载应用程序,以及启动进程。因此在集中式双控存储中,在业务不重启的情况下,需要快速升级在运行软件程序,提高可服务性,常规手段需要重新启动,无法导致业务不中断;且常规手段需要更新内存中的代码段数据,需要重新加载程序,需要进程重启,导致业务长时间中断,进而使得应用程序升级的安全性和可靠性得到不到保障。
针对上述问题,本实施例提供一种应用程序热升级方法,该方法通过so(SharedObject,共享内存)动态库,实现动态加载和函数级别的升级,实现快速升级,在秒级短暂等待时间后,实现快速升级,极大降低了对业务影响,并且通过极速升级,直接替换更新函数,实现极速升级,甚至可达到对业务0影响。
图1为本发明提供的应用程序热升级方法的流程示意图之一;如图1所示,该方法的执行主体可以是目标控制系统中用于进行应用程序升级的应用程序热升级装置,该方法包括:
步骤110,从目标控制系统的共享内存中,加载所述目标控制系统中待升级应用程序的源升级文件对应的动态库升级文件;
此处的目标控制系统为所需进行应用程序升级的控制系统,该系统可以是双控系统或者多控系统;该系统的类型可以是Linux等其他类型。以下以目标控制系统为是Linux类型的双控系统为例对本实施例提供的应用程序热升级方法展开描述。
图2为本发明提供的Linux系统的计算机程序的结构示意图;如图2所示,在Linux系统下,静态库以.a为后缀的文件。应用程序在编译链接的时候把库中的代码链接到可执行文件中,应用程序运行时将不再需要静态库。本质是在编译时把静态库中的代码(不是一次性加载,而是分页加载)复制到了进程的代码区中;Linux下,动态库以.so为后缀的文件。程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。其中,静态链接:将库中的相关代码复制进可执行程序中的过程。动态链接:在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中。
链接的本质:链接.o文件和.lib文件,链接是将多个目标文件和库文件合并成一个可执行文件的过程。链接器会解析目标文件中的符号引用,并将其与符号定义进行匹配。链接过程包括符号解析、重定位和符号表管理等。
图3为本发明提供的双控系统的结构示意图;如图3所示,双控系统包括两个控制节点,分别为控制节点1和控制节点2;每一控制节点上部署有多个业务模块、集群管理器以及存储进程(或称stor进程)。
此处的待升级应用程序为所需进行升级的应用程序;该应用程序可以是双控系统中任一组件中的应用程序,如可以是控制节点,也可是控制节点上部署的业务模块和集群管理器。
此处的共享内存中预先存储有基于各应用程序的各种升级版本的源升级文件编译生成的动态库升级文件。
可选地,在需要对目标控制系统中待升级应用程序进行升级时,可以是依据待升级应用程序的程序标识或者待升级应用程序的源升级文件的文件标识,在共享内存中关联加载相应的动态库升级文件(或称.so升级文件)。所称的加载方式可以是基于内存映射、动态链接、加载器加载等方式实现。所称的动态库升级文件可以是二进制文件。
步骤120,根据所述待升级应用程序的当前配置文件,获取所述待升级应用程序的当前版本号和当前函数清单列表;
可选地,读取待升级应用程序的配置文件;该配置文件至少包含应用程序的版本信息和函数清单列表;
对配置文件进行解析,以从配置文件中提取出待升级应用程序的当前版本号,以及提取出当前应用程序中包含的函数清单列表;当前版本号可以是一个数字、字符串或者其他形式的标识符,用于表示当前应用程序的版本;函数清单列表可能包括函数名、参数列表、返回类型等信息,用于描述应用程序中的各个函数。
步骤130,根据所述动态库升级文件和所述当前版本号,对所述当前函数清单列表中的函数进行更新,并将更新的函数清单列表加载至所述待升级应用程序的进程空间中,并生成所述待升级应用程序的目标函数地址;所述目标函数地址为所述更新的函数清单列表在所述进程空间中的函数地址;
可选地,在获取到待升级应用程序的.so升级文件,以及当前函数清单列表之后,可以是依据动态库升级文件,对当前函数清单列表中的函数进行更新,得到更新的函数清单列表;并将更新的函数清单列表加载至待升级应用程序的进程空间中,以依据更新的函数清单列表在进程空间中所对应的函数地址,确定待升级应用程序的目标函数地址。
步骤140,通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新。
所称的进程跟踪系统(或称ptrace系统)是一种用于在Linux和其他类Unix操作系统中进行进程监控和调试的机制。其允许一个进程(通常是调试器或监控程序)监视另一个进程的活动,并且可以在目标进程中执行操作,比如读写其内存、修改寄存器值、单步执行等。
可选地,在获取到目标函数地址之后,可以是查找当前进程所使用的对应的函数地址,以确定待更新函数地址和待更新函数;并在开始升级时,基于ptrace系统调用,暂停运行进程中的代码,并根据目标函数地址,对进程空间中待更新函数地址进行更新操作,以及根据更新的函数清单列表中的函数,对进程空间中的待更新函数进行更新操作,以在更新完成之后,恢复运行进程中的代码,由此实现应用程序的热升级。所称的更新包括但不限于新增和/或替换。
此处,待升级应用程序的函数更新和地址更新可以是通过用户态和内核态交互实现更新,也可以是通过动态链接实现更新。
本实施例提供的方法,通过动态库动态加载动态库升级文件,并通过ptrace系统调用,依据动态库升级文件实现应用程序的函数级别的升级,一方面在秒级短暂等待时间后,达到秒级快速升级。极大地缩短了升级所需的时间,显著减少了业务中断时间,提高了系统的可用性;另一方面,针对函数级别的更新,而非整个应用程序,因此能够最大限度地减少对正在运行业务的影响,甚至可以达到对业务0影响;且升级过程中不需要重启应用程序或整个系统,因此能够进一步保持业务的连续性和稳定性,由此实现应用程序的热升级,进而提高应用程序升级的高效、安全和可靠。
在一些实施例中,步骤140中所述通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新,包括:
通过所述进程跟踪系统执行如下更新步骤:
向所述待升级应用程序所属组件的内核态中的系统调用模块发送更新请求;所述更新请求包括用于进行函数和地址更新的请求;
接收所述系统调用模块返回的响应信息;所述响应信息是由所述系统调用模块在接收到所述更新请求的情况下,根据所述更新请求,对所述待升级应用程序所属组件的用户态进行权限验证生成的;
在根据所述响应信息确定所述用户态通过权限验证的情况下,暂停运行所述进程空间中的代码;
向所述内核态发送地址更新指令,以供所述内核态在接收到所述地址更新指令的情况下,将所述目标函数地址替换到所述待更新函数地址所处的地址位上;
向所述内核态发送函数更新指令,以供所述内核态在接收到所述函数更新指令的情况下,根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数依次进行更新;
接收所述内核态通过所述系统调用模块返回的更新状态信息;
在根据所述更新状态信息,确定所述待更新函数地址更新完成,且所述待更新函数更新完成的情况下,恢复运行所述进程空间中的代码。
此处,用户态和内核态这两个名词与CPU(Central Processing Unit,中央处理器)特权级别分层机制密不可分。所称的是CPU特权级别分层机制是一种保护数据和系统安全性的手段,防止数据和系统因为用户的错误操作或者破坏者的攻击而出现异常,这种机制也常被称为CPU保护环(或称Protection Rings)。
CPU保护环是由CPU硬件本身提供的保护机制,并不是操作系统提供的能力,其所涉及到的特权级别分层本质上是CPU指令集权限分级。CPU指令集是CPU实现控制硬件的关键,每一条汇编语句构成一条CPU指令,多个CPU指令构成CPU指令集。CPU指令集是可以直接操作硬件的,为了防止不懂硬件操作的人误操作导致系统异常的问题,CPU对指令集进行了权限设定。
图4为本发明提供的CPU指令集的结构示意图;如图4所示,以x86架构Intel的CPU环为例:该类CPU提供4层权限级别,从指令环Ring0到指令环Ring3,权限级别依次降低。
其中,指令环Ring0的权限最高,可以使用所有CPU指令集。
指令环Ring3权限最低,只能使用受限的CPU指令集。
用户态是运行应用程序的地方,其所对应的CPU权限等级是Ring3,其能够执行的CPU指令集是有限的,只能完成一些简单的操作(比如,客户可以自己去ATM机取钱,银行没有限制)。
内核态是运行内核程序的地方,其所对应的CPU权限等级是Ring0,其能够使用所有的CPU指令集,能操作系统中的所有数据。
图5为本发明提供的用户态、系统调用、内核态和系统底层硬件之间关系的结构示意图,如图5所示,用户态的程序如果想要操作系统底层硬件,就只能通过系统调用让位于内核态的程序来帮助其完成系统底层硬件的操作,待内核态程序处理完成之后再将结果返回给用户态程序。
需要说明的是,由系统调用可以牵扯出一个概念——CPU上下文切换。CPU上下文切换指的是CPU处理过程中的CPU寄存器和程序计数器pc数值的切换;1次系统调用会触发2次CPU上下文切换。其中,第一次上下文切换是从用户态切换内核态,此时要对用户态的程序进行现场保存等一系列操作;第二次上下文切换是内核态处理完后,从内核态返回用户态,此时要对用户态的程序进行现场恢复等一系列操作。因此,为了减少上下文切换对应用程序升级的影响,可以采取以下措施:优化升级流程:尽量减少升级过程中不必要的系统调用和上下文切换。例如,可以通过批量处理或异步操作来减少升级过程中的上下文切换次数。选择合适的升级时机:在系统负载较低时进行升级,以减少上下文切换对系统性能的影响。加强测试和验证:在升级前进行充分的测试和验证,确保升级过程的安全性和稳定性。这包括验证新版本的完整性、检查升级过程中的潜在风险以及制定相应的应对措施。
可选地,步骤140中的更新升级步骤可以通过ptrace系统执行如下更新步骤:
通过ptrace系统向待升级应用程序所属组件的内核态中的系统调用模块发送请求进行函数和地址更新的更新请求,以便用户态在接收到更新请求的情况下,依据更新请求中的用户态信息,在内存管理和进程管理中查找相应的权限配置信息,以依据权限配置信息,验证用户态的升级权限,并依据验证结果返回相应的响应信息。
在接收到系统调用模块返回的响应信息的情况下,通过ptrace系统对响应信息进行解析,以确定用户态是否通过权限验证;在通过权限验证的情况下,通过ptrace系统调用,暂停运行进程空间中的代码。
通过ptrace系统向内核态发送地址更新指令,以便内核态在接收到地址更新指令的情况下,将目标函数地址替换到待更新函数地址所处的地址位上,以及向内核态发送函数更新指令,以便内核态在接收到函数更新指令的情况下,将新版本中的函数清单(也即更新的函数清单列表)中的函数替换依次修改进程空间中的待更新函数。
在基于系统调用模块返回的更新状态信息,确定待更新函数地址更新完成,且待更新函数更新完成的情况下,恢复运行进程空间中的代码,由此完成待升级应用程序的热升级。
本实施例提供的方法,通过用户态与内核态交互实现权限验证,以及待升级应用程序的热升级,有效增强安全性、精确更新,以及快速恢复业务连续性,有效提升了应用程序升级过程的可靠性、效率和安全性。
在一些实施中,步骤140中通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新,包括:
在所述待升级应用程序的数量为多个的情况下,从各所述待升级应用程序的当前配置文件中,解析获取各所述待升级应用程序的升级优先等级和依赖关系;
根据所述依赖关系和所述升级优先等级,确定各所述待升级应用程序的升级顺序;
按照所述升级顺序,依次调用各所述待升级应用程序的进程空间对应的进程跟踪系统,根据各所述待升级应用程序对应的目标函数地址,对各所述待升级应用程序的进程空间中的待更新函数地址进行更新,以及根据各所述待升级应用程序对应的更新的函数清单列表中的函数,对各所述待升级应用程序的进程空间中的待更新函数进行更新。
可选地,当有多个待升级的应用程序时,首先会从每个应用程序的当前配置文件中解析出各自的升级优先等级和依赖关系。所称的升级优先等级通常是根据应用程序的重要性、业务影响程度等因素来设定的,而依赖关系则表明应用程序之间的运行依赖,比如某个应用程序可能需要在另一个应用程序升级后才能进行升级。
随后,根据解析出的依赖关系和升级优先等级,构建出一个升级顺序图或逻辑顺序。所称的顺序图会考虑到应用程序之间的依赖关系,确保在升级过程中不会因为依赖关系而导致服务中断或错误。同时,也会尽量优先升级优先等级较高的应用程序。
随后,按照确定的升级顺序,开始依次处理每个待升级的应用程序。对于每个应用程序,均会调用其对应的进程空间中的进程跟踪系统,根据获取的目标函数地址和更新的函数清单列表,对进程空间中的待更新函数地址和函数进行更新;具体更新步骤参见上述各实施例中关于地址更新和函数更新的具体描述,此处不再赘述。
需要说明的是,在升级过程中,还会实时监控升级状态,并在每次升级完成后,通过日志或界面反馈给用户或管理员升级的结果,包括是否成功、有无错误等。
本实施例提供的方法,在存在多个待升级的应用程序时,通过解析依赖关系和升级优先等级来确定升级顺序,可以确保在升级过程中避免因为应用程序之间的依赖关系而导致的问题,如服务中断、数据不一致等,这种有序升级的方式大大提高了升级的可靠性和成功率;并且,依次按照升级顺序升级应用程序,可以充分利用系统资源,避免多个应用程序同时升级导致的资源竞争和性能下降。同时,优先升级重要或关键的应用程序也可以更快地恢复或提升系统的整体性能;此外,通过精确的函数级别升级和依赖关系管理,可以在升级过程中最大程度地保持系统的稳定性。即使某个应用程序的升级出现问题,由于其他应用程序还未升级,也可以快速回滚或修复,避免整个系统的崩溃或不稳定。综上所述,本实施例提供的方法通过有序管理待升级应用程序的依赖关系和升级优先等级,实现了高效、可靠和可管理的应用程序升级过程,对提升系统稳定性和业务连续性具有重要意义。
在一些实施中,在执行步骤110之前,该方法还包括:
通过动态库编译器,根据所述源升级文件编译生成至少一个目标文件,并对至少一个所述目标文件进行链接,得到所述动态库升级文件;
将所述动态库升级文件以共享动态库的形式存储至所述共享内存中。
所称的源升级文件,可以是包含应用程序需要更新的代码、数据或配置信息。源升级文件可能是一个或多个,具体取决于升级的内容和范围。
可选地,可以是通过动态库编译器调用gcc-fPIC-shared指令,根据源升级文件编译生成至少一个目标文件,并对至少一个所述目标文件进行链接,以生成动态库升级文件;随后,将动态库升级文件以共享动态库的形式存储至共享内存中。
例如,对于业务模块1,其动态库升级文件的生成代码可以为“gcc业务模块1.c-fPIC-shared-o lib业务模块1_v1.1.so”;其中,gcc-fPIC-shared是一组用于GCC(GNUCompiler Collection,GNU编译器)的命令行选项,用于编译共享库;业务模块1.c为参与编译的源升级文件;-fPIC:生成与位置无关的代码,这是生成动态链接库所必需的;-shared:告诉链接器生成动态链接库而不是可执行文件;-o:指定输出文件名;-lib业务模块1_v1.1.so为动态库升级文件。
本实施例提供的方法,通过动态库编译器生成动态库升级文件,并以共享动态库的形式存储至共享内存中,对应用程序升级带来了高效性、资源共享、动态更新以及稳定性提升等诸多有益效果。
在一些实施中,步骤130中所述根据所述动态库升级文件和所述当前版本号,对所述当前函数清单列表中的函数进行更新,包括:
将所述动态库升级文件的版本号与所述当前版本号进行匹配;
在所述动态库升级文件的版本号与所述当前版本号不匹配的情况下,将所述动态库升级文件中函数与所述当前函数清单列表中的函数进行匹配,得到与所述当前函数清单列表中的函数不匹配的目标函数;
根据所述目标函数,对所述当前函数清单列表中的函数进行更新。
可选地,在函数清单列表更新的过程中,先读取动态库升级文件的版本号,并将其与当前已加载的当前版本号进行比较,以快速判断是否需要进一步的更新操作;如果动态库升级文件的版本号与当前版本号不匹配,说明需要进行升级。此时,会提取动态库升级文件中的函数列表,并与当前已加载的动态库文件中的函数清单列表进行逐项比对。通过比较,以识别出动态库文件中的函数清单列表中哪些函数是新增的、哪些函数是被修改的、哪些函数是被删除的,以及哪些函数保持不变,由此得到与当前函数清单列表不匹配的函数被称为目标函数。
随后,根据识别出的目标函数,执行相应的更新操作。对于新增的函数,系统会将其添加到当前函数清单列表中;对于被修改的函数,系统会替换原有的函数实现;对于被删除的函数,系统会从当前函数清单列表中移除它们。
本实施例提供的方法,通过先比较版本号,可以迅速判断是否需要进一步执行函数级别的更新。如果版本号相同,说明当前动态库已经是最新版本,无需进行任何操作,从而减少了不必要的计算和IO操作;并通过函数级别的匹配和更新,可以确保只更新那些真正需要变动的部分,而不是整个动态库文件。这既减少了更新所需的时间和带宽,又降低了升级过程中可能引入的风险。综上所述,通过对动态库升级文件的版本号与当前版本号进行匹配,并根据函数清单列表进行精确更新,可以实现高效、精确且稳定的应用程序升级过程。
在一些实施例中,步骤110中从目标控制系统的共享内存中,加载所述目标控制系统中待升级应用程序的源升级文件对应的动态库升级文件,包括:
通过动态加载库函数,对所述共享内存中的共享动态库执行打开操作,并获取共享动态库的打开状态;
在根据所述打开状态,确定所述共享动态库已打开的情况下,通过函数指针,在所述共享动态库中,动态加载所述动态库升级文件。
可选地,在加载动态库升级文件时,通过动态加载库函数(如dlopen函数),对共享内存中的共享动态库执行打开操作,并依据打开状态确定共享动态库是否已打开;在打开共享库失败,打印错误信息并退出。在确定共享动态库已打开的情况下,可以是通过动态链接库符号查找函数(如dlsym函数)进行符号查找以及依赖查找到的符号的地址位,为函数指针的地址位赋值,由此实现根据函数指针动态加载动态库升级文件;并在加载完成之后,关闭打开的共享库并退出。
示例性地,动态链表库动态加载文件的代码为:
本实施例提供的方法,通过动态库动态加载动态库升级文件,进而允许在运行时根据需要加载或卸载特定的库文件,这使得系统或应用程序的升级更加灵活。当新的功能或修复需要添加到系统中时,无需重启整个系统或应用程序,只需替换或更新相应的动态库文件中的函数即可,由此实现在不中断服务的情况下进行升级,实现应用程序的热升级,进而提高应用程序升级的高效、安全和可靠。
在一些实施例中,所述待升级应用程序所属的组件包括目标控制系统中的控制节点、业务模块和集群管理器中的至少一项组件。
可选地,待升级应用程序所属的组件可以目标控制系统中的控制节点,也可以是业务模块,也可以是集群管理器;相应地,待升级应用程序可以是业务模块中所需升级的应用程序,也可以是集群管理器中所需升级的应用程序,也可以是控制节点中所需升级的应用程序。
以下以具体的示例对目标控制系统中不同组件的应用程序升级过程展开具体描述。
如图3所示,目标控制系统上电后,stor进程启动;各组件,如集群管理器、业务模块1、业务模块2,通过gcc-fPIC-shared生成动态库so,便于后期加载,启动各组件,并正常运行各组件,在需要进行组件的应用程序热升级时,通过dlopen/dlsym指令加载各组件的动态库升级文件,以通过动态库升级文件实现应用程序热升级。
图6为本发明提供的应用程序热升级方法的流程示意图之二,如图6所示,对于控制节点1中业务模块1,通过动态库升级文件实现应用程序热升级的具体步骤包括:
首先,获取业务模块1的待升级应用程序的新生成的.so文件;
接着,获取业务模块1的当前配置文件,以从中获取当前版本号和当前函数清单列表;
接着,根据当前版本号和.so文件的版本号之间的比对结果,替换当前函数清单列表中的函数,并将更新的函数清单列表加载到进程空间,以获取修改代码的函数地址,也即更新的函数清单列表在进程空间中的函数地址;
接着,查找业务模块1的当前进程使用对应的函数地址,以确定待更新函数地址;
接着,通过ptrace系统调用,暂停进程中运行的代码
接着,通过ptrace系统将更新后的函数地址(或称修改代码的函数地址)替换到待更新函数地址上
接着,将新版本中的函数清单(或称更新的函数清单列表)中的函数替换依次修改;
最后,恢复业务模块1中的业务运行。
同样地,对于其他业务模块,如控制节点2中业务模块1、业务模块2等,通过动态库升级文件实现应用程序热升级的具体步骤可参见控制节点1中业务模块1的热升级步骤,此处不再赘述。
对于集群管理器的应用程序升级和控制节点的应用程序升级,两者的升级步骤与上述控制节点1中业务模块1的热升级步骤类似;其中,多控制节点升级的步骤包括:
首先,获取控制节点1和控制节点2的待升级应用程序的新生成的.so文件;
接着,获取控制节点1和控制节点2的当前配置文件,以从中获取当前版本号和当前函数清单列表;
接着,根据当前版本号和.so文件的版本号之间的比对结果,替换当前函数清单列表中的函数,并将更新的函数清单列表加载到进程空间,以获取修改代码的函数地址,也即更新的函数清单列表在进程空间中的函数地址;
接着,查找控制节点1和控制节点2的当前进程使用对应的函数地址,以确定待更新函数地址;
接着,通过ptrace系统调用,暂停控制节点1和控制节点2的进程中运行的代码
接着,通过ptrace系统将更新后的函数地址(或称修改代码的函数地址)替换到待更新函数地址上
接着,将新版本中的函数清单(或称更新的函数清单列表)中的函数替换依次修改;
最后,恢复控制节点1和控制节点2中的业务运行。
所称的ptrace系统调用是指调用ptrace系统命令;其中,ptrace系统命令的示例代码如下:
综上,本实施例提供的应用程序热升级方法,通过联合so动态库和ptrace系统进行动态加载.so文件和依据.so文件进行函数级别的升级可实现各种应用程序的快速热升级,进而提高各种应用程序升级的高效、安全和可靠。
下面对本发明提供的应用程序热升级装置进行描述,下文描述的应用程序热升级装置与上文描述的应用程序热升级方法可相互对应参照。
图7为本发明提供的应用程序热升级装置的结构示意图;如图7所示,该装置包括:
加载单元710用于从目标控制系统的共享内存中,加载所述目标控制系统中待升级应用程序的源升级文件对应的动态库升级文件;
解析单元720用于根据所述待升级应用程序的当前配置文件,获取所述待升级应用程序的当前版本号和当前函数清单列表;
更新单元730用于根据所述动态库升级文件和所述当前版本号,对所述当前函数清单列表中的函数进行更新,并将更新的函数清单列表加载至所述待升级应用程序的进程空间中,并生成所述待升级应用程序的目标函数地址;所述目标函数地址为所述更新的函数清单列表在所述进程空间中的函数地址;
升级单元730用于通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新。
本实施例提供的装置,通过动态库动态加载动态库升级文件,并通过ptrace系统调用,依据动态库升级文件实现应用程序的函数级别的升级,一方面在秒级短暂等待时间后,达到秒级快速升级。极大地缩短了升级所需的时间,显著减少了业务中断时间,提高了系统的可用性;另一方面,针对函数级别的更新,而非整个应用程序,因此能够最大限度地减少对正在运行业务的影响,甚至可以达到对业务0影响;且升级过程中不需要重启应用程序或整个系统,因此能够进一步保持业务的连续性和稳定性,由此实现应用程序的热升级,进而提高应用程序升级的高效、安全和可靠。
本发明提供的装置是用于执行上述各方法实施例的,具体流程和详细内容请参照上述实施例,此处不再赘述。
图8示例了一种电子设备的实体结构示意图,如图8所示,该电子设备可以包括:处理器(processor)810、通信接口(Communications Interface)820、存储器(memory)830和通信总线840,其中,处理器810,通信接口820,存储器830通过通信总线840完成相互间的通信。处理器810可以调用存储器830中的逻辑指令,以执行应用程序热升级,该方法包括:从目标控制系统的共享内存中,加载所述目标控制系统中待升级应用程序的源升级文件对应的动态库升级文件;根据所述待升级应用程序的当前配置文件,获取所述待升级应用程序的当前版本号和当前函数清单列表;根据所述动态库升级文件和所述当前版本号,对所述当前函数清单列表中的函数进行更新,并将更新的函数清单列表加载至所述待升级应用程序的进程空间中,并生成所述待升级应用程序的目标函数地址;所述目标函数地址为所述更新的函数清单列表在所述进程空间中的函数地址;通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新。
此外,上述的存储器830中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括计算机程序,计算机程序可存储在非暂态计算机可读存储介质上,所述计算机程序被处理器执行时,计算机能够执行上述各方法所提供的应用程序热升级,该方法包括:从目标控制系统的共享内存中,加载所述目标控制系统中待升级应用程序的源升级文件对应的动态库升级文件;根据所述待升级应用程序的当前配置文件,获取所述待升级应用程序的当前版本号和当前函数清单列表;根据所述动态库升级文件和所述当前版本号,对所述当前函数清单列表中的函数进行更新,并将更新的函数清单列表加载至所述待升级应用程序的进程空间中,并生成所述待升级应用程序的目标函数地址;所述目标函数地址为所述更新的函数清单列表在所述进程空间中的函数地址;通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新。
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各方法提供的应用程序热升级,该方法包括:从目标控制系统的共享内存中,加载所述目标控制系统中待升级应用程序的源升级文件对应的动态库升级文件;根据所述待升级应用程序的当前配置文件,获取所述待升级应用程序的当前版本号和当前函数清单列表;根据所述动态库升级文件和所述当前版本号,对所述当前函数清单列表中的函数进行更新,并将更新的函数清单列表加载至所述待升级应用程序的进程空间中,并生成所述待升级应用程序的目标函数地址;所述目标函数地址为所述更新的函数清单列表在所述进程空间中的函数地址;通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (10)

1.一种应用程序热升级方法,其特征在于,包括:
从目标控制系统的共享内存中,加载所述目标控制系统中待升级应用程序的源升级文件对应的动态库升级文件;
根据所述待升级应用程序的当前配置文件,获取所述待升级应用程序的当前版本号和当前函数清单列表;
根据所述动态库升级文件和所述当前版本号,对所述当前函数清单列表中的函数进行更新,并将更新的函数清单列表加载至所述待升级应用程序的进程空间中,并生成所述待升级应用程序的目标函数地址;所述目标函数地址为所述更新的函数清单列表在所述进程空间中的函数地址;
通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新。
2.根据权利要求1所述的应用程序热升级方法,其特征在于,所述通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新,包括:
通过所述进程跟踪系统执行如下更新步骤:
向所述待升级应用程序所属组件的内核态中的系统调用模块发送更新请求;所述更新请求包括用于进行函数和地址更新的请求;
接收所述系统调用模块返回的响应信息;所述响应信息是由所述系统调用模块在接收到所述更新请求的情况下,根据所述更新请求,对所述待升级应用程序所属组件的用户态进行权限验证生成的;
在根据所述响应信息确定所述用户态通过权限验证的情况下,暂停运行所述进程空间中的代码;
向所述内核态发送地址更新指令,以供所述内核态在接收到所述地址更新指令的情况下,将所述目标函数地址替换到所述待更新函数地址所处的地址位上;
向所述内核态发送函数更新指令,以供所述内核态在接收到所述函数更新指令的情况下,根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数依次进行更新;
接收所述内核态通过所述系统调用模块返回的更新状态信息;
在根据所述更新状态信息,确定所述待更新函数地址更新完成,且所述待更新函数更新完成的情况下,恢复运行所述进程空间中的代码。
3.根据权利要求1所述的应用程序热升级方法,其特征在于,所述通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新,包括:
在所述待升级应用程序的数量为多个的情况下,从各所述待升级应用程序的当前配置文件中,解析获取各所述待升级应用程序的升级优先等级和依赖关系;
根据所述依赖关系和所述升级优先等级,确定各所述待升级应用程序的升级顺序;
按照所述升级顺序,依次调用各所述待升级应用程序的进程空间对应的进程跟踪系统,根据各所述待升级应用程序对应的目标函数地址,对各所述待升级应用程序的进程空间中的待更新函数地址进行更新,以及根据各所述待升级应用程序对应的更新的函数清单列表中的函数,对各所述待升级应用程序的进程空间中的待更新函数进行更新。
4.根据权利要求1-3任一项所述的应用程序热升级方法,其特征在于,所述从目标控制系统的共享内存中,加载所述目标控制系统中待升级应用程序的源升级文件对应的动态库升级文件之前,包括:
通过动态库编译器,根据所述源升级文件编译生成至少一个目标文件,并对至少一个所述目标文件进行链接,得到所述动态库升级文件;
将所述动态库升级文件以共享动态库的形式存储至所述共享内存中。
5.根据权利要求1-3任一项所述的应用程序热升级方法,其特征在于,所述根据所述动态库升级文件和所述当前版本号,对所述当前函数清单列表中的函数进行更新,包括:
将所述动态库升级文件的版本号与所述当前版本号进行匹配;
在所述动态库升级文件的版本号与所述当前版本号不匹配的情况下,将所述动态库升级文件中函数与所述当前函数清单列表中的函数进行匹配,得到与所述当前函数清单列表中的函数不匹配的目标函数;
根据所述目标函数,对所述当前函数清单列表中的函数进行更新。
6.根据权利要求1-3任一项所述的应用程序热升级方法,其特征在于,所述从目标控制系统的共享内存中,加载所述目标控制系统中待升级应用程序的源升级文件对应的动态库升级文件,包括:
通过动态加载库函数,对所述共享内存中的共享动态库执行打开操作,并获取共享动态库的打开状态;
在根据所述打开状态,确定所述共享动态库已打开的情况下,通过函数指针,在所述共享动态库中,动态加载所述动态库升级文件。
7.根据权利要求1-3任一项所述的应用程序热升级方法,其特征在于,所述待升级应用程序所属的组件包括目标控制系统中的控制节点、业务模块和集群管理器中的至少一项组件。
8.一种应用程序热升级装置,其特征在于,包括:
加载单元,用于从目标控制系统的共享内存中,加载所述目标控制系统中待升级应用程序的源升级文件对应的动态库升级文件;
解析单元,用于根据所述待升级应用程序的当前配置文件,获取所述待升级应用程序的当前版本号和当前函数清单列表;
更新单元,用于根据所述动态库升级文件和所述当前版本号,对所述当前函数清单列表中的函数进行更新,并将更新的函数清单列表加载至所述待升级应用程序的进程空间中,并生成所述待升级应用程序的目标函数地址;所述目标函数地址为所述更新的函数清单列表在所述进程空间中的函数地址;
升级单元,用于通过所述进程空间对应的进程跟踪系统,根据所述目标函数地址,对所述进程空间中待更新函数地址进行更新,以及根据所述更新的函数清单列表中的函数,对所述进程空间中的待更新函数进行更新。
9.一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至7任一项所述应用程序热升级方法。
10.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至7任一项所述应用程序热升级方法。
CN202410383344.9A 2024-03-30 应用程序热升级方法、系统、电子设备及存储介质 Pending CN118259952A (zh)

Publications (1)

Publication Number Publication Date
CN118259952A true CN118259952A (zh) 2024-06-28

Family

ID=

Similar Documents

Publication Publication Date Title
Xu et al. Early detection of configuration errors to reduce failure damage
JP7090657B2 (ja) アプリケーションをアップグレードするための方法、装置、デバイスならびに記憶媒体
US8589889B2 (en) Apparatus and method of detecting errors in embedded software
US8140907B2 (en) Accelerated virtual environments deployment troubleshooting based on two level file system signature
US10592237B2 (en) Efficient detection of architecture related bugs during the porting process
US7784044B2 (en) Patching of in-use functions on a running computer system
US7243348B2 (en) Computing apparatus with automatic integrity reference generation and maintenance
CN110795128B (zh) 一种程序漏洞修复方法、装置、存储介质及服务器
US20110138374A1 (en) Downtime reduction for enterprise manager patching
US11385993B2 (en) Dynamic integration of command line utilities
US20070180441A1 (en) Method and system for avoidance of software conflict
CN108762825B (zh) 动态库重载的实现方法及系统
US20230036357A1 (en) Method and apparatus for authority control, computer device and storage medium
US7506241B2 (en) Method and apparatus for a self healing agent
US9690564B2 (en) Runtime detection of software configurations and upgrades
Shi et al. Industry practice of coverage-guided enterprise linux kernel fuzzing
US8799716B2 (en) Heap dump occurrence detection
US9256488B2 (en) Verification of template integrity of monitoring templates used for customized monitoring of system activities
Huang et al. Pallas: Semantic-aware checking for finding deep bugs in fast path
CN112668008A (zh) 一种基于lsm来实现动态的系统调用劫持的方法
US8689206B2 (en) Isolating operating system in-memory modules using error injection
CN108228266A (zh) 一种Android插件框架下不同插件间启动Fragment组件的方法和装置
CN118259952A (zh) 应用程序热升级方法、系统、电子设备及存储介质
Huang et al. {PYLIVE}:{On-the-Fly} code change for Python-based online services
US9836315B1 (en) De-referenced package execution

Legal Events

Date Code Title Description
PB01 Publication