本技术涉及计算机,尤其涉及一种数据处理方法、装置、设备及可读存储介质。
背景技术:
1、在程序的开发过程中,程序逻辑时常需要进行更新与迭代。针对核心框架基本固定,而业务逻辑变动频繁的项目,一般使用原生语言来编写核心框架,使用脚本语言来编写业务逻辑,在这样的混合语言开发模式中,框架层可以保证执行效率和稳定,逻辑层可以用于快速迭代开发与容错。因此,通过原生语言和脚本语言共同实现的混合语言程序逐渐流行。
2、程序上线运行后,往往需要依赖程序运行时的调用栈来了解程序的运行状态以及性能热点。现有的栈获取方式,可以获取原生语言程序对应的原生语言调用栈,可以获取脚本语言程序对应的脚本语言调用栈。但是针对混合语言程序,通过现有的栈获取方式,也依然只能分别获取到混合语言程序对应的原生语言调用栈和脚本语言调用栈,其中,原生语言调用栈只能描述出混合语言程序中原生函数之间的调用关系,脚本语言调用栈只能描述出混合语言程序中脚本函数之间的调用关系。显然,在混合语言程序中,脚本函数与原生函数之间也是互相调用的。也就是说,通过现有的栈获取方式获取到的两个调用栈不能准确描述出混合语言程序中原生函数和脚本函数之间的调用关系。
技术实现思路
1、本技术实施例提供了一种数据处理方法、装置、设备及可读存储介质,可以生成能够准确描述混合语言程序中原生函数与脚本函数之间的调用关系的调用栈,从而提高程序的性能探查效率。
2、本技术实施例一方面提供了一种数据处理方法,包括:
3、对混合语言程序对应的目标进程进行跨进程环境获取处理,得到目标进程对应的脚本执行环境指针;
4、当检测到目标进程的运行时长到达目标周期时,暂停目标进程,通过脚本执行环境指针进行脚本栈调用模拟处理,得到目标进程对应的脚本语言调用栈;
5、获取目标进程对应的原生语言调用栈;
6、根据原生语言调用栈中的原生函数对应的原生函数名分别与目标原生函数名集合和虚拟机入口函数名之间的匹配关系,对原生语言调用栈和脚本语言调用栈进行栈合并处理,得到针对混合语言程序的混合语言调用栈;
7、其中,目标原生函数名集合中的原生函数用于辅助调用脚本函数;原生语言调用栈中的原生函数对应的原生函数名与目标原生函数名集合之间的匹配关系,用于指示确定原生语言调用栈中可被转移至混合语言调用栈的原生函数;原生语言调用栈中的原生函数对应的原生函数名与虚拟机入口函数名之间的匹配关系,用于指示确定脚本语言调用栈中可被转移至混合语言调用栈的脚本函数。
8、本技术实施例一方面提供了一种数据处理装置,包括:
9、第一获取模块,用于对混合语言程序对应的目标进程进行跨进程环境获取处理,得到目标进程对应的脚本执行环境指针;
10、第二获取模块,用于当检测到目标进程的运行时长到达目标周期时,暂停目标进程,通过脚本执行环境指针进行脚本栈调用模拟处理,得到目标进程对应的脚本语言调用栈;
11、第三获取模块,用于获取目标进程对应的原生语言调用栈;
12、栈合并模块,用于根据原生语言调用栈中的原生函数对应的原生函数名分别与目标原生函数名集合和虚拟机入口函数名之间的匹配关系,对原生语言调用栈和脚本语言调用栈进行栈合并处理,得到针对混合语言程序的混合语言调用栈;
13、其中,目标原生函数名集合中的原生函数用于辅助调用脚本函数;原生语言调用栈中的原生函数对应的原生函数名与目标原生函数名集合之间的匹配关系,用于指示确定原生语言调用栈中可被转移至混合语言调用栈的原生函数;原生语言调用栈中的原生函数对应的原生函数名与虚拟机入口函数名之间的匹配关系,用于指示确定脚本语言调用栈中可被转移至混合语言调用栈的脚本函数。
14、其中,第一获取模块,包括:
15、第一指针获取单元,用于通过跨进程环境获取接口暂停目标进程;
16、第一指针获取单元,还用于若混合语言程序包含全局指针变量,则对目标进程的地址空间进行符号搜索,得到全局指针变量对应的变量地址;
17、第一指针获取单元,还用于获取变量地址存储的全局指针变量值,将全局指针变量值确定为目标进程对应的脚本执行环境指针;
18、第一指针获取单元,还用于恢复运行目标进程。
19、其中,第一获取模块,包括:
20、第一地址获取单元,用于通过跨进程环境获取接口暂停目标进程;
21、第一地址获取单元,还用于若混合语言程序包含静态无参函数,则对目标进程的地址空间进行符号搜索,得到静态无参函数对应的指针函数地址;
22、执行单元,用于根据指针函数地址执行静态无参函数,得到指针函数执行结果;
23、第二指针获取单元,用于将指针函数执行结果确定为目标进程对应的脚本执行环境指针;
24、第二指针获取单元,还用于恢复运行目标进程。
25、其中,执行单元,包括:
26、第一处理子单元,用于获取处于暂停状态的目标进程对应的寄存器,将寄存器中存储的数据确定为原始寄存器数据;寄存器包括第一通用寄存器、第二通用寄存器和指令寄存器;第一通用寄存器用于存储函数地址;第二通用寄存器用于存储当前正在执行的函数对应的返回值;指令寄存器用于存储等待执行的下一条指令对应的指令地址;
27、第一处理子单元,还用于为静态无参函数分配内存空间,在内存空间写入指令数据;指令数据包括指针调用指令和中断指令;指针调用指令用于指示调用第一通用寄存器存储的函数地址;中断指令用于指示触发目标进程中断;
28、第一处理子单元,还用于将第一通用寄存器存储的函数地址更新为指针函数地址,将指令寄存器存储的指令地址更新为用于指向指令数据的内存空间地址;
29、第一运行子单元,用于恢复运行目标进程;
30、第一运行子单元,还用于当对指令寄存器中存储的内存空间地址所指向的指针调用指令进行调用时,通过指针调用指令调用第一通用寄存器存储的指针函数地址,根据指针函数地址执行静态无参函数;
31、第一中断子单元,用于当对指令寄存器中存储的内存空间地址所指向的中断指令进行调用时,基于中断指令对目标进程进行中断,第二通用寄存器存储的返回值确定为指针函数执行结果;
32、第一中断子单元,还用于将寄存器中存储的数据恢复为原始寄存器数据,确定目标进程退出中断状态;退出中断状态用于指示目标进程恢复运行。
33、其中,第一获取模块,包括:
34、第二地址获取单元,用于通过跨进程环境获取接口暂停目标进程;
35、第二地址获取单元,还用于若混合语言程序包含指针传参函数,则对目标进程的地址空间进行符号搜索,得到指针传参函数对应的指针函数地址;
36、断点运行单元,用于根据指针函数地址对指针传参函数进行断点运行处理,得到指针传参函数对应的目标参数,将目标参数确定为目标进程对应的脚本执行环境指针;目标参数为在执行指针传参函数的过程中所获取到的第一个参数;
37、恢复运行单元,用于恢复运行目标进程。
38、其中,断点运行单元,包括:
39、第二处理子单元,用于将指针函数地址存储的指令,确定为函数开始指令;
40、第二处理子单元,还用于将指针函数地址存储的函数开始指令,更新存储为中断指令;中断指令用于指示触发目标进程中断;
41、第二运行子单元,用于恢复运行目标进程;
42、第二中断子单元,用于当中断指令被调用时,基于中断指令对目标进程进行中断,获取参数寄存器;参数寄存器用于存储在执行指针传参函数的过程中所获取到的第一个参数;
43、第二中断子单元,还用于将参数寄存器中存储的参数,确定为指针传参函数对应的目标参数;
44、第二中断子单元,还用于将目标参数确定为目标进程对应的脚本执行环境指针;
45、第二中断子单元,还用于将指针函数地址存储的中断指令,恢复更新为函数开始指令;
46、第二中断子单元,还用于对程序计数器进行回退处理,得到新的程序计数器;新的程序计数器用于指示目标进程恢复运行时,执行函数开始指令;
47、第二中断子单元,还用于确定目标进程退出中断状态;退出中断状态用于指示目标进程恢复运行。
48、其中,第二获取模块,包括:
49、进程暂停单元,用于当检测到目标进程的运行时长到达目标周期时,暂停目标进程;
50、第一获取单元,用于根据脚本执行环境指针获取脚本环境结构体中的顶层脚本函数指针和底层脚本函数指针;
51、第二获取单元,用于根据顶层脚本函数指针获取顶层脚本函数结构体中的顶层脚本函数信息和邻层脚本函数指针;
52、栈调用模拟单元,用于根据顶层脚本函数信息将顶层脚本函数添加至初始脚本语言调用栈的尾部,得到中间脚本语言调用栈;初始脚本语言调用栈为空栈;
53、栈调用模拟单元,还用于若邻层脚本函数指针不等于底层脚本函数指针,则继续根据邻层脚本函数指针获取邻层脚本函数结构体中的邻层脚本函数信息和用于指示下一个邻层脚本函数的邻层脚本函数指针,根据邻层脚本函数信息将邻层脚本函数添加至中间脚本语言调用栈的尾部;
54、栈调用模拟单元,还用于若邻层脚本函数指针等于底层脚本函数指针,则根据底层脚本函数指针获取底层脚本函数结构体中的底层脚本函数信息;
55、栈调用模拟单元,还用于根据底层脚本函数信息将底层脚本函数添加至中间脚本语言调用栈的尾部,得到脚本语言调用栈。
56、其中,顶层脚本函数结构体包括函数信息成员和邻层指针成员;
57、第二获取单元,包括:
58、第一地址获取子单元,用于确定邻层指针成员在顶层脚本函数结构体中的第一地址偏移量,根据第一地址偏移量和顶层脚本函数指针确定邻层指针成员对应的第一成员地址;
59、第一数据确定子单元,用于若确定邻层指针成员为指针类型,则对第一成员地址对应的成员数据转换为远程访问类型的成员数据,将远程访问类型的成员数据确定为邻层脚本函数指针;
60、第二地址获取子单元,用于确定函数信息成员在顶层脚本函数结构体中的第二地址偏移量,根据第二地址偏移量和顶层脚本函数指针确定函数信息成员对应的第二成员地址;
61、第二数据确定子单元,用于若确定函数信息成员不为指针类型,则获取第二成员地址对应的成员数据,将第二成员地址对应的成员数据确定为顶层脚本函数信息。
62、其中,栈合并模块,包括:
63、遍历单元,用于顺序遍历原生语言调用栈,获取遍历原生函数所对应的原生函数名;遍历原生函数为位于原生语言调用栈顶部的原生函数;
64、目标确定单元,用于根据遍历原生函数所对应的原生函数名分别与目标原生函数名集合和虚拟机入口函数名之间的匹配关系,从原生语言调用栈和脚本语言调用栈中确定目标合并函数;
65、非无效处理单元,用于若目标合并函数不为无效空函数,则将目标合并函数添加至待处理混合语言调用栈的尾部,从原生语言调用栈中删除遍历原生函数,继续遍历原生语言调用栈,将位于原生语言调用栈顶部的原生函数确定为下一个遍历原生函数;在对原生语言调用栈和脚本语言调用栈进行栈合并处理之前,待处理混合语言调用栈为空栈;
66、无效处理单元,用于若目标合并函数为无效空函数,则从原生语言调用栈中删除遍历原生函数,继续遍历原生语言调用栈,将位于原生语言调用栈顶部的原生函数确定为下一个遍历原生函数;
67、栈确定单元,用于若原生语言调用栈为空,则将待处理混合语言调用栈确定为针对混合语言程序的混合语言调用栈。
68、其中,目标确定单元,包括:
69、第一确定子单元,用于若遍历原生函数所对应的原生函数名与虚拟机入口函数名不匹配,且遍历原生函数对应的原生函数名与目标原生函数名集合不匹配,则将遍历原生函数确定为目标合并函数;
70、第二确定子单元,用于若遍历原生函数所对应的原生函数名与虚拟机入口函数名不匹配,且遍历原生函数对应的原生函数名与目标原生函数名集合匹配,则将无效空函数确定为目标合并函数;
71、第三确定子单元,用于若遍历原生函数所对应的原生函数名与虚拟机入口函数名匹配,且脚本语言调用栈不为空栈,则将位于脚本语言调用栈顶部的脚本函数确定为目标合并函数;
72、第四确定子单元,用于若遍历原生函数所对应的原生函数名与虚拟机入口函数名匹配,且脚本语言调用栈为空栈,则将遍历原生函数确定为目标合并函数。
73、其中,上述数据处理装置,还包括:
74、匹配确定模块,用于若遍历原生函数所对应的原生函数名不等于虚拟机入口函数名,则确定遍历原生函数所对应的原生函数名与虚拟机入口函数名不匹配;
75、匹配确定模块,还用于若遍历原生函数所对应的原生函数名等于虚拟机入口函数名,则确定遍历原生函数所对应的原生函数名与虚拟机入口函数名匹配;
76、匹配确定模块,还用于若目标原生函数名集合中包含遍历原生函数所对应的原生函数名,则确定遍历原生函数对应的原生函数名与目标原生函数名集合匹配;
77、匹配确定模块,还用于若目标原生函数名集合中不包含遍历原生函数所对应的原生函数名,则确定遍历原生函数对应的原生函数名与目标原生函数名集合不匹配。
78、其中,上述数据处理装置,还包括:
79、恢复运行模块,用于恢复运行目标进程;
80、栈信息获取模块,用于获取混合语言调用栈对应的混合语言调用栈信息,将所获取到的混合语言调用栈信息确定为目标周期对应的混合语言调用栈信息;
81、火焰图生成模块,用于当获取到m个周期分别对应的混合语言调用栈信息时,基于m个混合语言调用栈信息生成混合调用栈火焰图;m为正整数;m个周期包含目标周期;混合调用栈火焰图用于呈现在m个周期内目标进程的运行状态指标。
82、其中,上述数据处理装置,还包括:
83、曲线图生成模块,用于获取目标进程在目标周期内的系统资源占用信息;
84、曲线图生成模块,还用于根据m个周期分别对应的系统资源占用信息生成系统资源占用率曲线图;m个周期分别对应的系统资源占用信息包含目标进程在目标周期内的系统资源占用信息;资源占用率曲线图用于呈现目标进程在m个周期内占用的系统资源情况;
85、阶段图生成模块,用于响应针对系统资源占用率曲线图的曲线选择操作,获取所选择的曲线所对应的周期,作为待处理周期;
86、阶段图生成模块,还用于根据待处理周期分别对应的混合语言调用栈信息生成阶段混合调用栈火焰图;阶段混合调用栈火焰图用于呈现在待处理周期内目标进程的运行状态指标。
87、本技术实施例一方面提供了一种计算机设备,包括:处理器、存储器、网络接口;
88、上述处理器与上述存储器、上述网络接口相连,其中,上述网络接口用于提供数据通信网元,上述存储器用于存储计算机程序,上述处理器用于调用上述计算机程序,以执行本技术实施例中的方法。
89、本技术实施例一方面提供了一种计算机可读存储介质,上述计算机可读存储介质中存储有计算机程序,上述计算机程序适于由处理器加载并执行本技术实施例中的方法。
90、本技术实施例一方面提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中,计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行本技术实施例中的方法。
91、本技术实施例中,先对混合语言程序对应的目标进程进行跨进程环境获取处理,得到目标进程对应的脚本执行环境指针,然后在检测到目标进程的运行时长到达目标周期时,暂停目标进程,通过脚本执行环境指针进行脚本栈调用模拟处理,得到目标进程对应的脚本语言调用栈,接着获取目标进程对应的原生语言调用栈,最后根据原生语言调用栈中的原生函数对应的原生函数名分别与目标原生函数名集合和虚拟机入口函数名之间的匹配关系,对原生语言调用栈和脚本语言调用栈进行栈合并处理,得到针对混合语言程序的混合语言调用栈。其中,目标原生函数名集合中的原生函数用于辅助调用脚本函数;原生语言调用栈中的原生函数对应的原生函数名与目标原生函数名集合之间的匹配关系,用于指示确定原生语言调用栈中可被转移至混合语言调用栈的原生函数;原生语言调用栈中的原生函数对应的原生函数名与虚拟机入口函数名之间的匹配关系,用于指示确定脚本语言调用栈中可被转移至混合语言调用栈的脚本函数。采用本技术实施例提供的方法,针对混合语言程序,可以先分别获取其对应的原生语言调用栈和脚本语言调用栈,然后基于原生语言调用栈中的原生函数对应的原生函数名分别与目标原生函数名集合和虚拟机入口函数名之间的匹配关系,来对两者进行栈合并处理,进而得到可以准确描述混合语言程序中原生语言函数和脚本语言函数之间的函数调用关系的混合语言调用栈,基于混合语言调用栈可以快速了解混合语言程序的运行状态,从而提升对混合语言程序的性能探查效率。
1.一种数据处理方法,其特征在于,包括:
2.根据权利要求1所述的方法,其特征在于,所述对混合语言程序对应的目标进程进行跨进程环境获取处理,得到所述目标进程对应的脚本执行环境指针,包括:
3.根据权利要求1所述的方法,其特征在于,所述对混合语言程序对应的目标进程进行跨进程环境获取处理,得到所述目标进程对应的脚本执行环境指针,包括:
4.根据权利要求3所述的方法,其特征在于,所述根据所述指针函数地址执行所述静态无参函数,得到指针函数执行结果,包括:
5.根据权利要求1所述的方法,其特征在于,所述对混合语言程序对应的目标进程进行跨进程环境获取处理,得到所述目标进程对应的脚本执行环境指针,包括:
6.根据权利要求5所述的方法,其特征在于,所述根据所述指针函数地址对所述指针传参函数进行断点运行处理,得到所述指针传参函数对应的目标参数,将所述目标参数确定为所述目标进程对应的脚本执行环境指针,包括:
7.根据权利要求1所述的方法,其特征在于,所述当检测到所述目标进程的运行时长到达目标周期时,暂停所述目标进程,通过所述脚本执行环境指针进行脚本栈调用模拟处理,得到所述目标进程对应的脚本语言调用栈,包括:
8.根据权利要求7所述的方法,其特征在于,所述顶层脚本函数结构体包括函数信息成员和邻层指针成员;
9.根据权利要求1所述的方法,其特征在于,所述根据所述原生语言调用栈中的原生函数对应的原生函数名分别与目标原生函数名集合和虚拟机入口函数名之间的匹配关系,对所述原生语言调用栈和所述脚本语言调用栈进行栈合并处理,得到针对所述混合语言程序的混合语言调用栈,包括:
10.根据权利要求9所述的方法,其特征在于,所述根据遍历原生函数所对应的原生函数名分别与目标原生函数名集合和虚拟机入口函数名之间的匹配关系,从所述原生语言调用栈和所述脚本语言调用栈中确定目标合并函数,包括:
11.根据权利要求9所述的方法,其特征在于,还包括:
12.根据权利要求1所述的方法,其特征在于,还包括:
13.根据权利要求12所述的方法,其特征在于,还包括:
14.一种数据处理装置,其特征在于,包括:
15.一种计算机设备,其特征在于,包括:处理器、存储器以及网络接口;
16.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机程序,所述计算机程序适于由处理器加载并执行权利要求1-13任一项所述的方法。
17.一种计算机程序产品,包括计算机程序/指令,其特征在于,所述计算机程序/指令被处理器执行时,可以执行权利要求1-13任一项所述的方法。