一种建立函数栈的方法、装置、介质和电子设备制造方法及图纸

技术编号:24330658 阅读:34 留言:0更新日期:2020-05-29 19:29
本公开提供了一种建立函数栈的方法、装置、介质和电子设备。所述方法包括:获取指令计数器中的指令执行地址;当所述指令执行地址的值为第一调用函数的第一调用地址时,则获取第一返回地址和通过栈指针获取栈指针值;基于所述第一调用地址、所述第一返回地址和所述栈指针值检索历史函数栈数据集,获取检索结果;当所述检索结果非空时,则确定所述检索结果为与第二调用函数相关联的第二克隆函数栈地址,且创建与所述第一调用函数相关联的第一函数栈,并根据所述第二克隆函数栈地址将第二克隆函数栈中的信息复制到所述第一函数栈中。通过快速比较从历史函数栈数据集中找出相同函数栈,利用克隆函数栈创建对应的函数栈。避免重复计算,提升回溯效率。

【技术实现步骤摘要】
一种建立函数栈的方法、装置、介质和电子设备
本公开涉及计算机
,具体而言,涉及一种建立函数栈的方法、装置、介质和电子设备。
技术介绍
函数栈,是计算机科学中存储有关正在运行的子程序的消息的栈。函数栈最经常被用于存放子程序的返回地址。在调用任何子程序时,主程序都必须暂存子程序运行完毕后应该返回到的地址。因此,如果被调用的子程序还要调用其他的子程序,其自身的返回地址就必须存入函数栈,在其自身运行完毕后再行取回。在递归程序中,每一层次递归都必须在函数栈上增加一条地址,因此如果程序出现无限递归(或仅仅是过多的递归层次),函数栈就会产生栈溢出。在软件质量监控中,获取并分析程序运行过程中的函数栈是一种常用的技术手段。但是,通常获取函数栈是一个比较耗时的操作,影响程序的运行效率,从用户体验来看会带来卡顿、卡死的现象。特别是,当应用程序中存在有几百个线程时,频繁的、长时间的卡顿或卡死现象,令用户无法接受。
技术实现思路
提供该
技术实现思路
部分以便以简要的形式介绍构思,这些构思将在后面的具体实施方式部分被详细描述。该
技术实现思路
部分并不旨在标识要求保护的技术方案的关键特征或必要特征,也不旨在用于限制所要求的保护的技术方案的范围。本公开的目的在于提供一种建立函数栈的方法、装置、介质和电子设备,能够解决上述提到的至少一个技术问题。具体方案如下:根据本公开的具体实施方式,第一方面,本公开提供一种建立函数栈的方法,包括:获取指令计数器中的指令执行地址;当所述指令执行地址的值为第一调用函数的第一调用地址时,则获取第一返回地址和通过栈指针获取栈指针值;以及基于所述第一调用地址、所述第一返回地址和所述栈指针值检索历史函数栈数据集,获取检索结果;当所述检索结果非空时,则确定所述检索结果为与第二调用函数相关联的第二克隆函数栈地址,且创建与所述第一调用函数相关联的第一函数栈,并根据所述第二克隆函数栈地址将第二克隆函数栈中的信息复制到所述第一函数栈中。根据本公开的具体实施方式,第二方面,本公开提供一种建立函数栈的装置,包括:获取指令执行地址单元,用于获取指令计数器中的指令执行地址;获取参数信息单元,用于当所述指令执行地址的值为第一调用函数的第一调用地址时,则获取第一返回地址和通过栈指针获取栈指针值;检索单元,用于基于所述第一调用地址、所述第一返回地址和所述栈指针值检索历史函数栈数据集,获取检索结果;第一复制单元,用于当所述检索结果非空时,则确定所述检索结果为与第二调用函数相关联的第二克隆函数栈地址,且创建与所述第一调用函数相关联的第一函数栈,并根据所述第二克隆函数栈地址将第二克隆函数栈中的信息复制到所述第一函数栈中。根据本公开的具体实施方式,第三方面,本公开提供一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现如第一方面任一项所述建立函数栈的方法。根据本公开的具体实施方式,第四方面,本公开提供一种电子设备,包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现如第一方面任一项所述建立函数栈的方法。本公开实施例的上述方案与现有技术相比,至少具有以下有益效果:本公开提供了一种建立函数栈的方法、装置、介质和电子设备。本公开通过快速比较函数栈信息,从历史函数栈数据集中找出相同函数栈,并利用克隆函数栈快速创建对应的函数栈。避免重复计算,提升函数栈回溯效率。优化后,效率提升2~3倍。其中,效果与重复的线程个数相关。附图说明结合附图并参考以下具体实施方式,本公开各实施例的上述和其他特征、优点及方面将变得更加明显。贯穿附图中,相同或相似的附图标记表示相同或相似的元素。应当理解附图是示意性的,原件和元素不一定按照比例绘制。在附图中:图1示出了根据本公开实施例的建立函数栈的方法的流程图;图2示出了根据本公开实施例的建立函数栈的方法的函数栈和线程栈的关系示意图;图3示出了根据本公开实施例的建立函数栈的方法的函数调用示意图;图4示出了根据本公开实施例的建立函数栈的装置的单元框图;图5示出了根据本公开的实施例的电子设备连接结构示意图。具体实施方式下面将参照附图更详细地描述本公开的实施例。虽然附图中显示了本公开的某些实施例,然而应当理解的是,本公开可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本公开。应当理解的是,本公开的附图及实施例仅用于示例性作用,并非用于限制本公开的保护范围。应当理解,本公开的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本公开的范围在此方面不受限制。本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。需要注意,本公开中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。需要注意,本公开中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。本公开实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。下面结合附图详细说明本公开的可选实施例。对本公开提供的第一实施例,即一种建立函数栈的方法的实施例。下面结合图1和图2对本公开实施例进行详细说明建立函数栈。步骤S101,获取指令计数器中的指令执行地址。对于所述方法应用于ARM架构,对函数调用过程中涉及三个重要的寄存器:指令计数器(简称PC寄存器)、链接寄存器(简称LR寄存器)和栈指针(简称SP寄存器)。PC寄存器和LR寄存器均指向代码段。每个线程启动的时候,都会创建一个线程栈和PC寄存器。PC寄存器里保存有当前正在执行的JVM指令的地址。每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器用于保存下一条将要执行的指令地址的寄存器。PC寄存器的内容总是指向下一条将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。LR寄存器保存当前函数的返回地址。且LR寄存器的地址保存在函数栈的第一个位置。SP寄存器指向线程栈栈顶。请参见图2所示,对于Linux系统,每个线程都有一个对应的线程栈。例如,线程启动时启动线程栈M,线程中包括:函数A、函数B、函数C和函数D;其中,函数A本文档来自技高网...

【技术保护点】
1.一种建立函数栈的方法,其特征在于,包括:/n获取指令计数器中的指令执行地址;/n当所述指令执行地址的值为第一调用函数的第一调用地址时,则获取第一返回地址和通过栈指针获取栈指针值;以及/n基于所述第一调用地址、所述第一返回地址和所述栈指针值检索历史函数栈数据集,获取检索结果;/n当所述检索结果非空时,则确定所述检索结果为与第二调用函数相关联的第二克隆函数栈地址,且创建与所述第一调用函数相关联的第一函数栈,并根据所述第二克隆函数栈地址将第二克隆函数栈中的信息复制到所述第一函数栈中。/n

【技术特征摘要】
1.一种建立函数栈的方法,其特征在于,包括:
获取指令计数器中的指令执行地址;
当所述指令执行地址的值为第一调用函数的第一调用地址时,则获取第一返回地址和通过栈指针获取栈指针值;以及
基于所述第一调用地址、所述第一返回地址和所述栈指针值检索历史函数栈数据集,获取检索结果;
当所述检索结果非空时,则确定所述检索结果为与第二调用函数相关联的第二克隆函数栈地址,且创建与所述第一调用函数相关联的第一函数栈,并根据所述第二克隆函数栈地址将第二克隆函数栈中的信息复制到所述第一函数栈中。


2.根据权利要求1所述的方法,其特征在于,所述基于所述第一调用地址、所述第一返回地址和所述栈指针值检索历史函数栈数据集,获取检索结果,包括:
基于所述第一调用地址、所述第一返回地址和页对齐值检索历史函数栈数据集,获取检索结果;其中,所述页对齐值是所述栈指针值的后三位的值。


3.根据权利要求1所述的方法,其特征在于,在所述获取检索结果后,还包括:
当所述检索结果为空时,则创建与所述第一调用函数相关联的第一函数栈,并将与所述第一调用函数相关联的调用信息存入所述第一函数栈中;其中,所述调用信息至少包括所述第一返回地址。


4.根据权利要求3所述的方法,其特征在于,在所述将与所述第一调用函数相关联的调用信息存入所述第一函数栈中后,还包括:
基于所述第一函数栈获取第一函数栈地址;
将所述第一调用地址、所述第一返回地址、所述栈指针值和所述第一函数栈地址保存到历史函数栈数据集中。


5.根据权利要求4所述的方法,其特征在于,所述将所述第一...

【专利技术属性】
技术研发人员:朴英敏
申请(专利权)人:北京字节跳动网络技术有限公司
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1
相关领域技术
  • 暂无相关专利