[发明专利]用于确定调用栈栈帧的对象的方法、装置、设备和介质在审
申请号: | 202110302483.0 | 申请日: | 2021-03-22 |
公开(公告)号: | CN112925717A | 公开(公告)日: | 2021-06-08 |
发明(设计)人: | 刘洪凯 | 申请(专利权)人: | 北京字节跳动网络技术有限公司 |
主分类号: | G06F11/36 | 分类号: | G06F11/36 |
代理公司: | 北京开阳星知识产权代理有限公司 11710 | 代理人: | 祝乐芳 |
地址: | 100041 北京市石景山区*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 用于 确定 调用 栈栈帧 对象 方法 装置 设备 介质 | ||
本公开实施例涉及一种用于确定调用栈栈帧的对象的方法、装置、设备和介质,其中,该方法包括:申请第一内存区域,并确定其目标子区域;对目标子区域中存储的内容进行初始化;将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;该表中的第三个功能模块地址为预设目标回调功能模块的地址;基于第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;如果回溯出调用栈中的一个栈帧,则执行预设目标回调功能模块对应的代码段,并在执行过程中执行栈帧对象获取功能模块GetThisObject对应的代码段,以确定栈帧的当前对象。本公开实施例可以实现获取程序运行过程中栈帧的对象,为分析程序运行中的异常提供信息依据。
技术领域
本公开涉及计算机技术领域,尤其涉及一种用于确定调用栈栈帧的对象的方法、装置、设备和介质。
背景技术
Java是一门面向对象编程语言,它的每个方法(类似于C语言中的函数)都存在一个主体(或称为对象)。获取每个方法对应的主体,可以为排查与定位程序运行过程中的异常提供有效的信息。
程序的执行过程可看作连续的函数调用,函数调用过程通常使用堆栈实现,可以使用堆栈传递与存储函数调用过程中相关的参数、局部变量等信息。在现有的获取调用栈的方案中,通过调用系统的getStatckTrace函数获取调用栈中各个栈帧的信息(每个栈帧中维持着每个函数的调用所需要的各种信息)。然而,调用getStatckTrace函数通常只能得到各个栈帧的方法名,无法获取栈帧的对象(即方法对应的主体)。
因此,如何确定调用栈中栈帧的对象,仍是当前待解决的问题。
发明内容
为了解决上述技术问题或者至少部分地解决上述技术问题,本公开实施例提供了一种用于确定调用栈栈帧的对象的方法、装置、设备和介质。
第一方面,本公开实施例提供了一种用于确定调用栈栈帧的对象的方法,包括:
申请第一内存区域,并确定所述第一内存区域中的目标子区域;其中,所述目标子区域是所述第一内存区域的首地址对应的区域;
获取上下文参数和当前线程指针;
基于所述第一内存区域的首地址、所述上下文参数和当前线程指针,执行构造功能模块对应的代码段,对所述目标子区域中存储的内容进行初始化;
将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,所述自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;
基于所述第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;
如果回溯出所述调用栈中的一个栈帧,则执行所述预设目标回调功能模块对应的代码段;
在执行所述预设目标回调功能模块对应的代码段的过程中,基于所述第一内存区域的首地址,执行栈帧对象获取功能模块GetThisObject对应的代码段;
基于执行所述栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,确定所述栈帧的当前对象。
第二方面,本公开实施例还提供了一种用于确定调用栈栈帧的对象的装置,包括:
第一内存区域申请模块,用于申请第一内存区域,并确定所述第一内存区域中的目标子区域;其中,所述目标子区域是所述第一内存区域的首地址对应的区域;
参数获取模块,用于获取上下文参数和当前线程指针;
内容初始化模块,用于基于所述第一内存区域的首地址、所述上下文参数和当前线程指针,执行构造功能模块对应的代码段,对所述目标子区域中存储的内容进行初始化;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京字节跳动网络技术有限公司,未经北京字节跳动网络技术有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202110302483.0/2.html,转载请声明来源钻瓜专利网。