CN112925717B - 用于确定调用栈栈帧的对象的方法、装置、设备和介质 - Google Patents

用于确定调用栈栈帧的对象的方法、装置、设备和介质 Download PDF

Info

Publication number
CN112925717B
CN112925717B CN202110302483.0A CN202110302483A CN112925717B CN 112925717 B CN112925717 B CN 112925717B CN 202110302483 A CN202110302483 A CN 202110302483A CN 112925717 B CN112925717 B CN 112925717B
Authority
CN
China
Prior art keywords
stack frame
function module
executing
address
stack
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.)
Active
Application number
CN202110302483.0A
Other languages
English (en)
Other versions
CN112925717A (zh
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.)
Beijing ByteDance Network Technology Co Ltd
Original Assignee
Beijing ByteDance Network Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing ByteDance Network Technology Co Ltd filed Critical Beijing ByteDance Network Technology Co Ltd
Priority to CN202110302483.0A priority Critical patent/CN112925717B/zh
Publication of CN112925717A publication Critical patent/CN112925717A/zh
Priority to PCT/CN2022/076544 priority patent/WO2022199283A1/zh
Application granted granted Critical
Publication of CN112925717B publication Critical patent/CN112925717B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Executing Machine-Instructions (AREA)
  • Debugging And Monitoring (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本公开实施例涉及一种用于确定调用栈栈帧的对象的方法、装置、设备和介质,其中,该方法包括:申请第一内存区域,并确定其目标子区域;对目标子区域中存储的内容进行初始化;将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;该表中的第三个功能模块地址为预设目标回调功能模块的地址;基于第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;如果回溯出调用栈中的一个栈帧,则执行预设目标回调功能模块对应的代码段,并在执行过程中执行栈帧对象获取功能模块GetThisObject对应的代码段,以确定栈帧的当前对象。本公开实施例可以实现获取程序运行过程中栈帧的对象,为分析程序运行中的异常提供信息依据。

Description

用于确定调用栈栈帧的对象的方法、装置、设备和介质
技术领域
本公开涉及计算机技术领域,尤其涉及一种用于确定调用栈栈帧的对象的方法、装置、设备和介质。
背景技术
Java是一门面向对象编程语言,它的每个方法(类似于C语言中的函数)都存在一个主体(或称为对象)。获取每个方法对应的主体,可以为排查与定位程序运行过程中的异常提供有效的信息。
程序的执行过程可看作连续的函数调用,函数调用过程通常使用堆栈实现,可以使用堆栈传递与存储函数调用过程中相关的参数、局部变量等信息。在现有的获取调用栈的方案中,通过调用系统的getStatckTrace函数获取调用栈中各个栈帧的信息(每个栈帧中维持着每个函数的调用所需要的各种信息)。然而,调用getStatckTrace函数通常只能得到各个栈帧的方法名,无法获取栈帧的对象(即方法对应的主体)。
因此,如何确定调用栈中栈帧的对象,仍是当前待解决的问题。
发明内容
为了解决上述技术问题或者至少部分地解决上述技术问题,本公开实施例提供了一种用于确定调用栈栈帧的对象的方法、装置、设备和介质。
第一方面,本公开实施例提供了一种用于确定调用栈栈帧的对象的方法,包括:
申请第一内存区域,并确定所述第一内存区域中的目标子区域;其中,所述目标子区域是所述第一内存区域的首地址对应的区域;
获取上下文参数和当前线程指针;
基于所述第一内存区域的首地址、所述上下文参数和当前线程指针,执行构造功能模块对应的代码段,对所述目标子区域中存储的内容进行初始化;
将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,所述自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;
基于所述第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;
如果回溯出所述调用栈中的一个栈帧,则执行所述预设目标回调功能模块对应的代码段;
在执行所述预设目标回调功能模块对应的代码段的过程中,基于所述第一内存区域的首地址,执行栈帧对象获取功能模块GetThisObject对应的代码段;
基于执行所述栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,确定所述栈帧的当前对象。
第二方面,本公开实施例还提供了一种用于确定调用栈栈帧的对象的装置,包括:
第一内存区域申请模块,用于申请第一内存区域,并确定所述第一内存区域中的目标子区域;其中,所述目标子区域是所述第一内存区域的首地址对应的区域;
参数获取模块,用于获取上下文参数和当前线程指针;
内容初始化模块,用于基于所述第一内存区域的首地址、所述上下文参数和当前线程指针,执行构造功能模块对应的代码段,对所述目标子区域中存储的内容进行初始化;
内容更改模块,用于将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,所述自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;
第一执行模块,用于基于所述第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;
第二执行模块,用于如果回溯出所述调用栈中的一个栈帧,则执行所述预设目标回调功能模块对应的代码段;
第三执行模块,用于在执行所述预设目标回调功能模块对应的代码段的过程中,基于所述第一内存区域的首地址,执行栈帧对象获取功能模块GetThisObject对应的代码段;
栈帧对象确定模块,用于基于执行所述栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,确定所述栈帧的当前对象。
第三方面,本公开实施例还提供了一种电子设备,包括存储器和处理器,其中,所述存储器中存储有计算机程序,当所述计算机程序被所述处理器执行时,使得所述电子设备实现本公开实施例提供的任一所述的用于确定调用栈栈帧的对象的方法。
第四方面,本公开实施例还提供了一种计算机可读存储介质,所述存储介质中存储有计算机程序,当所述计算机程序被计算设备执行时,使得所述计算设备实现本公开实施例提供的任一所述的用于确定调用栈栈帧的对象的方法。
本公开实施例提供的技术方案与现有技术相比至少具有如下优点:
在本公开实施例中,首先申请第一内存区域,并确定第一内存区域的首地址对应的目标子区域,然后通过内容初始化和存储内容更改操作,实现将目标子区域中的存储内容确定为自定义虚拟功能模块表的地址,该表中的第三个功能模块地址为预设目标回调功能模块的地址;其次,基于第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;在回溯出一个栈帧时,则通过预设目标回调功能模块对应的代码段的执行,触发栈帧对象获取功能模块GetThisObject对应的代码段的执行,从而获取当前栈帧的对象,解决了现有方案中无法获取栈帧对象的问题,实现了有效获取程序运行过程中栈帧的对象,为分析程序运行中的异常提供了有效的信息依据。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本公开实施例提供的一种用于确定调用栈栈帧的对象的方法的流程图;
图2为本公开实施例提供的一种确定栈帧对象过程中关于初始化的流程图;
图3为本公开实施例提供的一种关于目标子区域的存储内容更改前和更改后的对比示意图;
图4为本公开实施例提供的另一种用于确定调用栈栈帧的对象的方法的流程图;
图5为本公开实施例提供的一种用于确定调用栈栈帧的对象的装置的结构示意图;
图6为本公开实施例提供的一种电子设备的结构示意图。
具体实施方式
为了能够更清楚地理解本公开的上述目的、特征和优点,下面将对本公开的方案进行进一步描述。需要说明的是,在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合。
在下面的描述中阐述了很多具体细节以便于充分理解本公开,但本公开还可以采用其他不同于在此描述的方式来实施;显然,说明书中的实施例只是本公开的一部分实施例,而不是全部的实施例。
图1为本公开实施例提供的一种用于确定调用栈栈帧的对象的方法的流程图,该方法可以由用于确定调用栈栈帧的对象的装置执行,该装置可以采用软件和/或硬件实现,并可集成在具有计算能力的电子设备上,例如移动终端、笔记本、电脑等。具体地,该用于确定调用栈栈帧的对象的装置可以采用软件开发工具包(Software Development Kit,SDK)的形式集成在电子设备上,当应用程序运行过程中需要执行调用栈的回溯(可以简称为栈回溯)时,直接调用即可,不仅可以实现栈帧对象的获取,还可以实现对栈回溯的有效控制。
如图1所示,本公开实施例提供的用于确定调用栈栈帧的对象的方法可以包括:
S101、申请第一内存区域,并确定第一内存区域中的目标子区域;其中,目标子区域是第一内存区域的首地址对应的区域。
通过申请第一内存区域,可以为后续执行栈回溯过程中需要的指针参数开辟存储空间,同时也是自定义构建栈回溯过程中需求的指针参数所必不可少的操作。示例性地,申请第一内存区域,并确定第一内存区域中的目标子区域,可以包括:为栈帧访问者(StackVisitor)类下的指针申请第一内存区域(该内存区域通常为一块连续内存区域,大小通常超过100字节,具体可以根据程序构建而定),并确定该第一内存区域的首地址,以及该首地址对应的目标子区域。例如在构建程序代码过程中,可以示例性地采用字符串myVisitor表示第一内存区域的首地址,以作为需要构建的栈帧访问者(StackVisitor)类下的指针。
S102、获取上下文参数和当前线程指针。
在应用程序运行过程中,可以通过执行上下文参数获取功能模块(ContextCreate)对应的代码段,获取上下文参数,从计算机程序执行流程的角度而言,即执行上下文参数获取函数(ContextCreate),获取其返回结果,该返回结果即上下文参数,并且在构建程序代码过程中可以示例性地采用字符串context表示该上下文参数。同时,可以通过执行线程指针获取功能模块(CurrentFromGdb)对应的代码段,获取当前线程指针,从计算机程序执行流程的角度而言,即执行线程指针获取函数(CurrentFromGdb),获取其返回结果,该返回结果即当前线程指针,并且在构建程序代码过程中可以示例性地采用字符串currentThread表示该当前线程指针。线程指针可以用于表征与区分程序运行过程中的当前线程。
S103、基于第一内存区域的首地址、上下文参数和当前线程指针,执行构造功能模块对应的代码段,对目标子区域中存储的内容进行初始化。
在本公开实施例中,构造功能模块对应的代码段即对应栈帧访问者(StackVisitor)类下的构造函数(例如可以表示为StackVisitorC)。从计算机程序执行流程的角度而言,可以将第一内存区域的首地址(myVisitor)、上下文参数(context)和当前线程指针(currentThread),作为前述构造函数的参数,例如可以将myVisitor作为第一个参数、将currentThread作为第二个参数、将context作为第三个参数,执行构造函数,实现对目标子区域中存储的内容进行初始化,也即实现对在前构建的栈帧访问者(StackVisitor)类下的指针指向的内容初始化,从而使得第一内存区域的首地址(myVisitor)被构建为真正的访问者(Visitor)对象。需要说明的是,如果构造函数执行过程中,还需要其他参数,可以采用与上下文参数或当前线程指针类似的获取方式实现获取。
图2为本公开实施例提供的一种调用栈回溯过程中关于初始化的流程图,用于对本公开实施例执行栈回溯过程中的初始化准备阶段进行示例行性说明,但不应理解为对本公开实施例的具体限定。如图2所示,从计算机程序执行流程的角度而言,初始化准备阶段可以包括以下操作:
S1201、调用栈回溯装置对应的程序包被调用,即初始化开始。
S1202、确定线程指针获取函数(CurrentFromGdb)。线程指针获取函数(CurrentFromGdb)用于获取程序运行过程中的当前线程指针。
S1203、确定栈帧访问者(StackVisitor)类下的构造函数(StackVisitorC)。构造函数(StackVisitorC)用于对栈帧访问者(StackVisitor)类下的指针指向的内容初始化。
S1204、确定场景(Context)类下的上下文参数获取函数(ContextCreate)。上下文参数获取函数(ContextCreate)用于获取程序运行过程中的上下文参数。
S1205、确定栈回溯函数(WalkStack)。栈回溯函数(WalkStack)用于启动调用栈的回溯。
S1206、确定栈帧字符串描述信息获取函数(DescribeLocation)。栈帧字符串描述信息获取函数(DescribeLocation)用于获取栈帧字符串描述信息。
S1207、确定栈帧对象获取函数(GetThisObject)。栈帧对象获取函数(GetThisObject)用于获取栈帧的当前对象。
S1208、确定对象转换函数(NewLocalRef)。对象转换函数(NewLocalRef)用于对栈帧对象获取函数(GetThisObject)的执行结果进行数据类型转换,以得到采用需求数据类型表示的栈帧对象。
S1209、初始化完成。
图2中所示出的各个函数是根据确定栈帧对象的过程中,需要用到的函数而定,可以根据需求进行调整,例如删减或者增加等。并且,图2中所示出的各个函数的确定顺序并无严格的顺序限定,即图2中示出的函数确定顺序仅作为一种示例。通过初始化操作确定各个函数,可以确保在确定栈帧对象的过程中成功调用各个函数(或者成功执行各个函数对应的代码段)。
S104、将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址。
利用构造函数(StackVisitorC)对目标子区域中的存储内容进行初始化后,目标子区域中的存储内容为系统默认的虚拟功能模块表的地址(即默认的虚拟函数表的地址,一个虚拟功能模块即对应一个虚拟函数),此时的存储内容属于无效数据,如果不更改该存储内容,采用本公开实施例的技术方案,在真正实现栈回溯过程中容易导致应用程序崩溃。因此,需要进一步对初始化后的目标子区域中的存储内容进行更改,使得目标子区域中存储自定义虚拟功能模块表的地址(即自定义的虚拟函数表的地址)。自定义虚拟功能模块表(或自定义虚拟函数表)可以在构建程序代码的过程中进行预先配置。自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块callback的地址。即对初始化后的目标子区域中的存储内容进行更改后,可以通过存储内容确定预设目标回调功能模块callback的地址。
示例性地,将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址,可以包括:首先将初始化后的目标子区域中的存储内容类型强转化为指针类型,然后将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址。
从计算机程序执行的角度而言,存储内容更改后,通过存储内容可以确定预设目标回调功能模块callback的地址,而构建的栈帧访问者(StackVisitor)类下的指针(第一内存区域的首地址)可以用于确定该存储内容对应的目标子区域,因此可以理解为栈帧访问者(StackVisitor)类下的指针指向预设目标回调函数callback,从而在执行栈回溯过程中,可以成功调用预设目标回调函数callback,对回溯的栈帧数量进行有效控制。其中,预设目标回调函数callback是在构建程序代码阶段,由开发人员自定义创建的非系统函数,对于实现可控栈回溯发挥着重要作用。
图3为本公开实施例提供的一种关于目标子区域(第一内存区域的首地址对应的区域)的存储内容更改前和更改后的对比示意图,用于对本公开实施例进行示例性说明,具体地,图3中上方的子图表示目标子区域的存储内容初始化后的一种示意图,图3中下方的子图表示目标子区域的初始化存储内容更改后的一种示意图。
如图3所示,利用构造函数(StackVisitorC)对申请的第一内存区域中目标子区域中的存储内容进行初始化后,目标子区域中的存储内容为系统默认的虚拟函数表的地址(也即前述默认的虚拟功能模块表的地址,一个虚拟功能模块即对应一个虚拟函数),默认虚拟函数表中可以包括多个默认的函数地址,示例性地可以包括默认地址1(例如Destructor1地址)、默认地址2(例如Destructor2地址)、默认地址3(例如_cxa_pure_virtual地址)。对目标子区域中的初始化存储内容进行更改后,目标子区域中的存储内容为自定义的虚拟函数表的地址(即前述自定义的虚拟功能模块表的地址),自定义虚拟函数表中同样可以包括多个函数地址,例如自定义虚拟函数表中前两个函数地址与默认虚拟函数表中前两个函数地址可以相同,均为默认地址1(例如Destructor1地址)、默认地址2(例如Destructor2地址),而自定义虚拟函数表中第三个函数地址为预设目标回调函数callback的地址。
需要说明的是,预设目标回调函数callback的地址为自定义虚拟函数表中的第三个函数地址,这是由设备系统决定的,原因在于启动栈回溯时所调用的栈回溯函数WalkStack为系统函数,为了保证栈回溯的成功实现,预设目标回调函数callback的地址在自定义虚拟函数表中的位置不可随意设置。
S105、基于第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯。
从计算机程序执行流程的角度而言,执行栈回溯功能模块WalkStack对应的代码段,也即执行栈回溯函数WalkStack。具体地,可以将第一内存区域的首地址(myVisitor)作为栈回溯函数WalkStack的参数,执行栈回溯函数WalkStack,启动栈回溯。
S106、如果回溯出调用栈中的一个栈帧,则执行预设目标回调功能模块对应的代码段。
继续从计算机程序执行流程的角度而言,执行预设目标回调功能模块对应的代码段,也即执行预设目标回调函数callback。在执行栈回溯函数WalkStack的过程中,每回溯出一个栈帧,便执行一次预设目标回调函数callback。并且,预设目标回调功能模块对应的代码段的执行次数,即预设目标回调函数的执行次数,在该函数执行过程中其执行次数可以被同步记录,例如预设目标回调函数callback的历史执行次数为N,当前启动预设目标回调函数callback的执行后,其执行次数更新为N+1,可以调用计时器对该执行次数进行统计。该执行次数可以作为后续确定是否结束栈回溯的一个判断依据。
S107、在执行预设目标回调功能模块对应的代码段的过程中,基于第一内存区域的首地址,执行栈帧对象获取功能模块GetThisObject对应的代码段。
执行栈帧对象获取功能模块GetThisObject对应的代码段,即执行栈帧对象获取函数GetThisObject。栈帧对象获取函数属于在预设目标回调函数的执行过程中被嵌套执行的函数。
具体地,每个回溯出一个栈帧,在执行预设目标回调函数的过程中,可以基于第一内存区域的首地址确定第一内存区域中的目标子区域,进而可以根据目标子区域中存储的自定义虚拟函数表,确定预设目标回调函数的地址,使得栈帧对象获取函数保持在预设目标回调函数的执行周期中执行。
S108、基于执行栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,确定栈帧的当前对象。
栈帧对象获取函数具有获取栈帧的当前对象的功能,因此,可以根据其执行结果确定每次回溯出的栈帧的当前对象,从而将栈帧的当前对象作为一种有效信息,用于分析程序运行过程中的异常。
可选地,基于执行栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,确定栈帧的当前对象,包括:
基于执行栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,执行对象转换功能模块NewLocalRef对应的代码段,得到栈帧的当前对象。
继续从计算机程序执行流程的角度而言,执行对象转换功能模块NewLocalRef对应的代码段,即执行对象转换函数NewLocalRef。对象转换函数用于对栈帧对象获取函数的执行结果进行数据类型转换,以得到采用需求数据类型表示的栈帧对象。前述涉及的各个函数均是在系统底层实现,例如执行栈帧对象获取函数得到的结果(或者称为转换前的栈帧对象),可以示例性地表示为objPtr,其属于系统本地服务层对应的编程语言下的对象类型,不属于基于预设编程语言(例如java)构建的程序可直接识别的对象,因此,需要利用对象转换函数对栈帧对象获取函数的执行结果进行数据类型转换,使得转换后的数据成为基于预设编程语言构建的程序可直接识别的对象,例如转换后的栈帧对象可以示例性地表示为jobj,其属于jobject类型。jobject类型是指一种jni(Java Native Interface,java本地接口)对象类型。通过使用java本地接口书写程序,可以确保代码在不同的平台上方便移植,在本公开实施例中,通过执行对象转换函数,得到的栈帧当前对象可以被基于预设编程语言构建的程序直接识别,从而有助于提高针对栈帧对象数据的处理效率。
进一步地,本公开实施例提供的用于确定调用栈栈帧的对象的方法还包括:将栈帧的当前对象从本地服务层传输至预设编程语言层,以在预设编程语言层对栈帧的当前对象进行处理;其中,预设编程语言层包括java层。预设编程语言层与应用程序的具体开发程序语言有关,例如针对java应用程序,预设编程语言层即java层。
在本公开实施例中,首先申请第一内存区域,并确定第一内存区域的首地址对应的目标子区域,然后通过内容初始化和存储内容更改操作,实现将目标子区域中的存储内容确定为自定义虚拟功能模块表的地址,该表中的第三个功能模块地址为预设目标回调功能模块的地址;其次,基于第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;在回溯出一个栈帧时,则通过预设目标回调功能模块对应的代码段的执行,触发栈帧对象获取功能模块GetThisObject对应的代码段的执行,从而获取当前栈帧的对象,解决了现有方案中无法获取栈帧对象的问题,实现了有效获取程序运行过程中栈帧的对象,为分析程序运行中的异常提供了有效的信息依据。
在上述技术方案的基础上,可选地,本公开实施例提供的用于确定调用栈栈帧的对象的方法还包括:申请第二内存区域;其中,第二内存区域用于存储各个栈帧的当前对象,即最终确定的各个栈帧的当前对象可以进行统一存储。申请第二内存区域可以在申请第一内存区域的同时被执行,也可以在基于执行栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,确定栈帧的当前对象之前的任一时间被执行。
示例性地,申请第二内存区域包括:为jobject类型下的数组申请第二内存区域,第二内存区域用于存储该数组中的各个元素。通过将获取到的各个栈帧的当前对象作为jobject类型下的数组中元素的形式进行存储,可以便于后续直接基于各个栈帧的对象进行异常分析。
可选地,基于第一内存区域的首地址,执行栈帧对象获取功能模块GetThisObject对应的代码段之前,本公开实施例提供的用于确定调用栈栈帧的对象的方法还包括:
基于第一内存区域的首地址,执行栈帧字符串描述信息获取功能模块DescribeLocation对应的代码段,获取栈帧字符串描述信息;
检测栈帧字符串描述信息中是否包括预设字符串,以在栈帧字符串描述信息中不包括预设字符串的情况下,执行栈帧对象获取功能模块GetThisObject对应的代码段;其中,预设字符串用于标记不需要获取当前对象的栈帧。
执行栈帧字符串描述信息获取功能模块DescribeLocation对应的代码段,即执行栈帧字符串描述信息获取函数DescribeLocation。通过获取栈帧字符串描述信息,可以实现对回溯出的栈帧的筛选,有针对性地获取栈帧的当前对象,提高栈帧对象的获取效率。
其中,预设字符串可以根据应用程序运行所依赖的硬件设备中的虚拟机类型,或者不同的栈帧筛选需求而定,本公开实施例不作具体限定。示例性地,预设字符串可以包括runtime method,其用于标记ART(Android Run Time,指安卓运行环境)虚拟机定义的方法,这类方法不需要获取当前对象。因此,如果通过检测确定当前的栈帧字符串描述信息中包括预设字符串runtime method,意味着针对该栈帧,无需执行栈帧对象获取函数GetThisObject;如果确定当前的栈帧字符串描述信息中不包括预设字符串runtimemethod,意味着针对该栈帧,需执行栈帧对象获取函数GetThisObject。
可选地,本公开实施例提供的用于确定调用栈栈帧的对象的方法还包括:
在执行预设目标回调功能模块对应的代码段的过程中,如果满足预设条件,则确定执行预设目标回调功能模块对应的代码段得到的目标结果,并基于目标结果结束调用栈的回溯;其中,预设条件包括:预设目标回调功能模块对应的代码段的执行次数达到执行次数阈值,或者,栈帧的当前对象类型属于需求类型。即在本公开实施例中,根据预设条件可以实现对栈回溯的有效控制,提高栈回溯效率,降低栈回溯的耗时。
在一种可选实施方式中,可以在执行预设目标回调功能模块对应的代码段的过程中,同步记录执行次数,如果截止当前的执行次数达到执行次数阈值,则可以确定执行预设目标回调功能模块对应的代码段得到的目标结果,例如该目标结果可以表示为false,并结束栈回溯;如果截止当前的执行次数未达到执行次数阈值,则可以确定执行预设目标回调功能模块对应的代码段得到的其他结果,例如该其他结果可以表示为true,并继续栈回溯。其中,执行次数阈值可以是预先设置的定值(即在构造程序代码阶段所预先设置的值),也可以是在程序运行过程中可自动化调整的一个值,本公开实施例对此不作具体限定。
示例性地,可以获取当前运行的线程的类型,并根据线程的类型,确定执行次数阈值;其中,线程的类型包括主线程或子线程;例如当采用现有方案中可用的线程类型确定方式确定当前运行的线程的类型为主线程,则可以将执行次数阈值设置为第一值,如果确定当前运行的线程的类型为子线程,则可以将执行次数阈值设置为第二值,第一值大于第二值,但本公开实施例对两者的具体取值不作限定。主线程的优先级高于子线程,主线程对应的执行次数阈值较大,相应地可以执行较多栈帧的回溯,有助于获取较多的栈帧信息,子线程对应的执行次数阈值较小,相应地可以执行较少栈帧的回溯,达到合理控制栈回溯的耗时。
示例性地,可以获取应用程序的当前运行状态信息,并根据当前运行状态信息,确定执行次数阈值;其中,当前运行状态信息包括运行正常或者运行异常。例如,如果应用程序的当前运行状态信息为运行正常,则可以将执行次数阈值设置为第三值,如果应用程序的当前运行状态信息为运行异常,则可以将执行次数阈值设置为第四值,第四值大于第三值,但本公开实施例对两者的具体取值不作限定。在程序运行正常情况下,由于不需要使用较多的栈帧信息进行应用程序的异常分析与定位,可以进行较少栈帧的回溯,但是在程序运行异常情况下,由于需要使用较多的栈帧信息进行应用程序的异常分析与定位,因此可以进行较多栈帧的回溯。
在一种可选实施方式中,可以预先确定需求的栈帧对象类型,例如预先确定某种特定的栈帧对象类型为需求类型,这具体可以根据实际情况确定。在确定当前栈帧的对象后,同时判断当前栈帧对象的类型是否属于需求类型,如果是,则可以结束栈回溯,如果否,则可以继续进行栈回溯。
图4为本公开实施例提供的另一种用于确定调用栈栈帧的对象的方法的流程图,用于从计算机程序执行流程的角度,对本公开实施例进行示例性说明,但不应理解为对本公开实施例的具体限定。并且,在构造程序代码过程中,本公开实施例中自定义的预设目标回调函数callback的函数名可以示例性地采用myVisitFrame表示。
如图4所示,本公开实施例提供的用于确定调用栈栈帧的对象的方法可以包括:
S401、创建特定对象类型jobject下的数组arrRet。
数组arrRet对应的存储空间用于存储后续得到的各个栈帧的当前对象。数组中的一个元素即表示一个栈帧对象。
S402、调用线程指针获取函数CurrentFromGdb,并确定其返回值,即当前线程指针currentThread。
S403、调用上下文参数获取函数ContextCreate,并确定其返回值,即上下文参数context。
S404、申请一块连续内存区域,并确定该内存区域的首地址myVisitor。
S405、将内存区域的首地址myVisitor作为第一个参数,将当前线程指针currentThread作为第二个参数,将上下文参数context作为第三个参数,调用构造函数StackVisitorC,将内存区域的首地址myVisitor构造成真正的访问者Visitor对象(或称为指针)。
S406、将指针myVisitor对应的目标子区域中存储内容的类型强转为指针类型,并更改该指针myVisitor指向的内容,使其指向自定义的虚拟函数表,自定义的虚拟函数表中第三个指针指向自定义的目标回调函数myVisitFrame。
S407、将指针myVisitor作为第一参数调用栈回溯函数WalkStack。
S408、确定是否回溯出一个栈帧。
如果是,则执行操作S409;如果否,则执行操作417,即结束栈回溯。
S409、调用自定义的目标回调函数myVisitFrame。
以下操作S410-操作S415属于在目标回调函数myVisitFrame中执行的操作。
S410、将指针myVisitor作为参数调用栈帧字符串描述信息获取函数DescribeLocation,并获取其返回值,即栈帧字符串描述信息curMethod。
S411、确定栈帧字符串描述信息curMethod中是否包括预设字符串runtimemethod。
如果是,则表示针对该栈帧不需要执行栈帧对象的获取操作,执行操作S415,即确定目标回调函数myVisitFrame的返回值为true,需要继续进行栈回溯;如果否,则表示针对该栈帧需要执行栈帧对象的获取操作,执行操作S412,以得到数据类型转换前的栈帧当前对象。并且,预设字符runtime method仅作为一种示例,不作为对本公开实施例的具体限定。
S412、调用栈帧对象获取函数GetThisObject,并确定返回值,即转换前的栈帧当前对象objPtr。
S413、调用对象转换函数NewLocalRef,并确定返回值,即转换后的栈帧当前对象jobj。
其中,objPtr作为转换前的栈帧对象的一种示例性地表示,以及objPtr作为转换后的栈帧对象的一种示例性地表示,均不作为对本公开实施例的具体限定。
S414、调用数组元素设置函数SetObjectArrayElement将转换后的栈帧当前对象jobj存储至数组arrRet对应的元素存储空间。
S415、返回true。
S416、确定自定义的目标回调函数myVisitFrame的返回值是否为true。
如果确定返回值为true,则继续执行栈回溯;如果确定返回值不是true,而是false,则结束栈回溯。
S417、结束。
本公开实施例通过调用设备系统中用于实现栈回溯的函数,以及更改虚函数表的方式,实现了对调用栈中栈帧对象的有效获取。
图5为本公开实施例提供的一种用于确定调用栈栈帧的对象的装置的结构示意图,该装置可以采用软件和/或硬件实现,并可集成在具有计算能力的电子设备上,例如移动终端、笔记本、电脑等。
如图5所示,本公开实施例提供的用于确定调用栈栈帧的对象的装置500可以包括第一内存区域申请模块501、参数获取模块502、内容初始化模块503、内容更改模块504、第一执行模块505、第二执行模块506、第三执行模块507和栈帧对象确定模块508,其中:
第一内存区域申请模块501,用于申请第一内存区域,并确定第一内存区域中的目标子区域;其中,目标子区域是第一内存区域的首地址对应的区域;
参数获取模块502,用于获取上下文参数和当前线程指针;
内容初始化模块503,用于基于第一内存区域的首地址、上下文参数和当前线程指针,执行构造功能模块对应的代码段,对目标子区域中存储的内容进行初始化;
内容更改模块504,用于将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;
第一执行模块505,用于基于第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;
第二执行模块506,用于如果回溯出调用栈中的一个栈帧,则执行预设目标回调功能模块对应的代码段;
第三执行模块507,用于在执行预设目标回调功能模块对应的代码段的过程中,基于第一内存区域的首地址,执行栈帧对象获取功能模块GetThisObject对应的代码段;
栈帧对象确定模块508,用于基于执行栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,确定栈帧的当前对象。
可选地,本公开实施例提供的用于确定调用栈栈帧的对象的装置500还包括:
描述信息获取模块,用于基于第一内存区域的首地址,执行栈帧字符串描述信息获取功能模块DescribeLocation对应的代码段,获取栈帧字符串描述信息;
字符串检测模块,用于检测栈帧字符串描述信息中是否包括预设字符串,以在栈帧字符串描述信息中不包括预设字符串的情况下,执行栈帧对象获取功能模块GetThisObject对应的代码段;其中,预设字符串用于标记不需要获取当前对象的栈帧。
可选地,栈帧对象确定模块508具体用于:
基于执行栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,执行对象转换功能模块NewLocalRef对应的代码段,得到栈帧的当前对象。
可选地,本公开实施例提供的用于确定调用栈栈帧的对象的装置500还包括:
对象传输模块,用于将栈帧的当前对象从本地服务层传输至预设编程语言层,以在预设编程语言层对栈帧的当前对象进行处理;其中,预设编程语言层包括java层。
可选地,本公开实施例提供的用于确定调用栈栈帧的对象的装置500还包括:
申请第二内存区域;其中,第二内存区域用于存储各个栈帧的当前对象。
可选地,本公开实施例提供的用于确定调用栈栈帧的对象的装置500还包括:
栈回溯结束模块,用于在执行预设目标回调功能模块对应的代码段的过程中,如果满足预设条件,则确定执行预设目标回调功能模块对应的代码段得到的目标结果,并基于目标结果结束调用栈的回溯;
其中,预设条件包括:预设目标回调功能模块对应的代码段的执行次数达到执行次数阈值,或者,栈帧的当前对象类型属于需求类型。
本公开实施例所提供的用于确定调用栈栈帧的对象的装置可执行本公开实施例所提供的任意用于确定调用栈栈帧的对象的方法,具备执行方法相应的功能模块和有益效果。本公开装置实施例中未详尽描述的内容可以参考本公开任意方法实施例中的描述。
图6为本公开实施例提供的一种电子设备的结构示意图,用于对实现本公开实施例提供的用于确定调用栈栈帧的对象的方法的电子设备进行示例性说明。本公开实施例中的电子设备可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、PDA(个人数字助理)、PAD(平板电脑)、PMP(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字TV、台式计算机、智能家居设备、可穿戴电子设备、服务器等等的固定终端。图6示出的电子设备仅仅是一个示例,不应对本公开实施例的功能和占用范围带来任何限制。
如图6所示,电子设备600包括一个或多个处理器601和存储器602。处理器601可以是中央处理单元(CPU)或者具有数据处理能力和/或指令执行能力的其他形式的处理单元,并且可以控制电子设备600中的其他组件以执行期望的功能。
存储器602可以包括一个或多个计算机程序产品,计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。易失性存储器例如可以包括随机存取存储器(RAM)和/或高速缓冲存储器(cache)等。非易失性存储器例如可以包括只读存储器(ROM)、硬盘、闪存等。在计算机可读存储介质上可以存储一个或多个计算机程序指令,处理器601可以运行程序指令,以实现本公开实施例提供的用于确定调用栈栈帧的对象的方法,还可以实现其他期望的功能。在计算机可读存储介质中还可以存储诸如输入信号、信号分量、噪声分量等各种内容。
其中,本公开实施例提供的用于确定调用栈栈帧的对象的方法可以包括:申请第一内存区域,并确定第一内存区域中的目标子区域;其中,目标子区域是第一内存区域的首地址对应的区域;获取上下文参数和当前线程指针;基于第一内存区域的首地址、上下文参数和当前线程指针,执行构造功能模块对应的代码段,对目标子区域中存储的内容进行初始化;将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;基于第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;如果回溯出调用栈中的一个栈帧,则执行预设目标回调功能模块对应的代码段;在执行预设目标回调功能模块对应的代码段的过程中,基于第一内存区域的首地址,执行栈帧对象获取功能模块GetThisObject对应的代码段;基于执行栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,确定栈帧的当前对象。应当理解,电子设备600还可以执行本公开方法实施例提供的其他可选实施方案。
在一个示例中,电子设备600还可以包括:输入装置603和输出装置604,这些组件通过总线系统和/或其他形式的连接机构(未示出)互连。
此外,该输入装置603还可以包括例如键盘、鼠标等等。
该输出装置604可以向外部输出各种信息,包括确定出的距离信息、方向信息等。该输出装置604可以包括例如显示器、扬声器、打印机、以及通信网络及其所连接的远程输出设备等等。
当然,为了简化,图6中仅示出了该电子设备600中与本公开有关的组件中的一些,省略了诸如总线、输入/输出接口等等的组件。除此之外,根据具体应用情况,电子设备600还可以包括任何其他适当的组件。
除了上述方法和设备以外,本公开实施例还提供一种计算机程序产品,其包括计算机程序或计算机程序指令,计算机程序或计算机程序指令在被计算设备执行时使得计算设备实现本公开实施例所提供的任意用于确定调用栈栈帧的对象的方法。
计算机程序产品可以以一种或多种程序设计语言的任意组合来编写用于执行本公开实施例操作的程序代码,程序设计语言包括面向对象的程序设计语言,诸如Java、C++等,还包括常规的过程式程序设计语言,诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户电子设备上执行、部分地在用户电子设备上执行、作为一个独立的软件包执行、部分在用户电子设备上且部分在远程电子设备上执行、或者完全在远程电子设备上执行。
此外,本公开实施例还可以提供一种计算机可读存储介质,其上存储有计算机程序指令,计算机程序指令在被计算设备执行时使得计算设备实现本公开实施例所提供的任意用于确定调用栈栈帧的对象的方法。
其中,本公开实施例提供的用于确定调用栈栈帧的对象的方法可以包括:申请第一内存区域,并确定第一内存区域中的目标子区域;其中,目标子区域是第一内存区域的首地址对应的区域;获取上下文参数和当前线程指针;基于第一内存区域的首地址、上下文参数和当前线程指针,执行构造功能模块对应的代码段,对目标子区域中存储的内容进行初始化;将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;基于第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;如果回溯出调用栈中的一个栈帧,则执行预设目标回调功能模块对应的代码段;在执行预设目标回调功能模块对应的代码段的过程中,基于第一内存区域的首地址,执行栈帧对象获取功能模块GetThisObject对应的代码段;基于执行栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,确定栈帧的当前对象。应当理解,计算机程序指令在被计算设备执行时,还可以使得计算设备实现本公开方法实施例提供的其他可选实施方案。
计算机可读存储介质可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以包括但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上仅是本公开的具体实施方式,使本领域技术人员能够理解或实现本公开。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本公开的精神或范围的情况下,在其它实施例中实现。因此,本公开将不会被限制于本文的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

Claims (10)

1.一种用于确定调用栈栈帧的对象的方法,其特征在于,包括:
申请第一内存区域,并确定所述第一内存区域中的目标子区域;其中,所述目标子区域是所述第一内存区域的首地址对应的区域;
获取上下文参数和当前线程指针;
基于所述第一内存区域的首地址、所述上下文参数和当前线程指针,执行构造功能模块对应的代码段,对所述目标子区域中存储的内容进行初始化;
将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,所述自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;
基于所述第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;
如果回溯出所述调用栈中的一个栈帧,则执行所述预设目标回调功能模块对应的代码段;
在执行所述预设目标回调功能模块对应的代码段的过程中,基于所述第一内存区域的首地址,执行栈帧对象获取功能模块GetThisObject对应的代码段;
基于执行所述栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,确定所述栈帧的当前对象。
2.根据权利要求1所述的方法,其特征在于,基于所述第一内存区域的首地址,执行栈帧对象获取功能模块GetThisObject对应的代码段之前,还包括:
基于所述第一内存区域的首地址,执行栈帧字符串描述信息获取功能模块DescribeLocation对应的代码段,获取栈帧字符串描述信息;
检测所述栈帧字符串描述信息中是否包括预设字符串,以在所述栈帧字符串描述信息中不包括所述预设字符串的情况下,执行所述栈帧对象获取功能模块GetThisObject对应的代码段;其中,所述预设字符串用于标记不需要获取当前对象的栈帧。
3.根据权利要求1所述的方法,其特征在于,基于执行所述栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,确定所述栈帧的当前对象,包括:
基于执行所述栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,执行对象转换功能模块NewLocalRef对应的代码段,得到所述栈帧的当前对象。
4.根据权利要求1所述的方法,其特征在于,还包括:
将所述栈帧的当前对象从本地服务层传输至预设编程语言层,以在所述预设编程语言层对所述栈帧的当前对象进行处理;其中,所述预设编程语言层包括java层。
5.根据权利要求1所述的方法,其特征在于,还包括:
申请第二内存区域;其中,所述第二内存区域用于存储各个栈帧的当前对象。
6.根据权利要求1所述的方法,其特征在于,还包括:
在执行所述预设目标回调功能模块对应的代码段的过程中,如果满足预设条件,则确定执行所述预设目标回调功能模块对应的代码段得到的目标结果,并基于所述目标结果结束所述调用栈的回溯;
其中,所述预设条件包括:所述预设目标回调功能模块对应的代码段的执行次数达到执行次数阈值,或者,所述栈帧的当前对象类型属于需求类型。
7.一种用于确定调用栈栈帧的对象的装置,其特征在于,包括:
第一内存区域申请模块,用于申请第一内存区域,并确定所述第一内存区域中的目标子区域;其中,所述目标子区域是所述第一内存区域的首地址对应的区域;
参数获取模块,用于获取上下文参数和当前线程指针;
内容初始化模块,用于基于所述第一内存区域的首地址、所述上下文参数和当前线程指针,执行构造功能模块对应的代码段,对所述目标子区域中存储的内容进行初始化;
内容更改模块,用于将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,所述自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;
第一执行模块,用于基于所述第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;
第二执行模块,用于如果回溯出所述调用栈中的一个栈帧,则执行所述预设目标回调功能模块对应的代码段;
第三执行模块,用于在执行所述预设目标回调功能模块对应的代码段的过程中,基于所述第一内存区域的首地址,执行栈帧对象获取功能模块GetThisObject对应的代码段;
栈帧对象确定模块,用于基于执行所述栈帧对象获取功能模块GetThisObject对应的代码段得到的结果,确定所述栈帧的当前对象。
8.根据权利要求7所述的装置,其特征在于,还包括:
描述信息获取模块,用于基于所述第一内存区域的首地址,执行栈帧字符串描述信息获取功能模块DescribeLocation对应的代码段,获取栈帧字符串描述信息;
字符串检测模块,用于检测所述栈帧字符串描述信息中是否包括预设字符串,以在所述栈帧字符串描述信息中不包括所述预设字符串的情况下,执行所述栈帧对象获取功能模块GetThisObject对应的代码段;其中,所述预设字符串用于标记不需要获取当前对象的栈帧。
9.一种电子设备,其特征在于,包括存储器和处理器,其中,所述存储器中存储有计算机程序,当所述计算机程序被所述处理器执行时,使得所述电子设备实现权利要求1-6中任一项所述的用于确定调用栈栈帧的对象的方法。
10.一种计算机可读存储介质,其特征在于,所述存储介质中存储有计算机程序,当所述计算机程序被计算设备执行时,使得所述计算设备实现权利要求1-6中任一项所述的用于确定调用栈栈帧的对象的方法。
CN202110302483.0A 2021-03-22 2021-03-22 用于确定调用栈栈帧的对象的方法、装置、设备和介质 Active CN112925717B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN202110302483.0A CN112925717B (zh) 2021-03-22 2021-03-22 用于确定调用栈栈帧的对象的方法、装置、设备和介质
PCT/CN2022/076544 WO2022199283A1 (zh) 2021-03-22 2022-02-17 用于确定调用栈栈帧的对象的方法、装置、设备和介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110302483.0A CN112925717B (zh) 2021-03-22 2021-03-22 用于确定调用栈栈帧的对象的方法、装置、设备和介质

Publications (2)

Publication Number Publication Date
CN112925717A CN112925717A (zh) 2021-06-08
CN112925717B true CN112925717B (zh) 2024-03-12

Family

ID=76175354

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110302483.0A Active CN112925717B (zh) 2021-03-22 2021-03-22 用于确定调用栈栈帧的对象的方法、装置、设备和介质

Country Status (2)

Country Link
CN (1) CN112925717B (zh)
WO (1) WO2022199283A1 (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112925717B (zh) * 2021-03-22 2024-03-12 北京字节跳动网络技术有限公司 用于确定调用栈栈帧的对象的方法、装置、设备和介质
CN115774583A (zh) * 2021-09-08 2023-03-10 华为技术有限公司 程序调用栈创建方法、栈回溯方法和装置
CN113760584B (zh) * 2021-09-23 2023-07-25 北京字跳网络技术有限公司 一种性能分析数据的获取方法、装置、设备及存储介质

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7080368B2 (en) * 2002-10-31 2006-07-18 International Business Machines Corporation Object oriented apparatus and method for preserving stack frame identity during inlined method calls
CN101539883A (zh) * 2009-05-05 2009-09-23 北京和利时系统工程有限公司 嵌入式系统的错误追踪方法和装置
CN103888447A (zh) * 2014-03-03 2014-06-25 珠海市君天电子科技有限公司 病毒的查杀方法及装置
CN107506622A (zh) * 2017-08-25 2017-12-22 武汉大学 一种基于内存对象访问序列的软件动态胎记及抄袭检测方法
CN108268770A (zh) * 2018-02-05 2018-07-10 烽火通信科技股份有限公司 一种栈溢出检测系统及方法
CN110442504A (zh) * 2019-08-02 2019-11-12 中国工商银行股份有限公司 基于调用栈分析的性能测试方法和装置
CN111813465A (zh) * 2020-06-19 2020-10-23 北京字节跳动网络技术有限公司 一种信息获取方法、装置、介质和设备
CN112000484A (zh) * 2020-09-01 2020-11-27 北京元心科技有限公司 栈帧地址随机化方法及相关设备

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11442739B2 (en) * 2019-09-16 2022-09-13 International Business Machines Carporation Exception handling
CN111813641B (zh) * 2020-06-19 2024-05-17 北京字节跳动网络技术有限公司 崩溃信息收集的方法、装置、介质和设备
CN112925717B (zh) * 2021-03-22 2024-03-12 北京字节跳动网络技术有限公司 用于确定调用栈栈帧的对象的方法、装置、设备和介质

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7080368B2 (en) * 2002-10-31 2006-07-18 International Business Machines Corporation Object oriented apparatus and method for preserving stack frame identity during inlined method calls
CN101539883A (zh) * 2009-05-05 2009-09-23 北京和利时系统工程有限公司 嵌入式系统的错误追踪方法和装置
CN103888447A (zh) * 2014-03-03 2014-06-25 珠海市君天电子科技有限公司 病毒的查杀方法及装置
CN107506622A (zh) * 2017-08-25 2017-12-22 武汉大学 一种基于内存对象访问序列的软件动态胎记及抄袭检测方法
CN108268770A (zh) * 2018-02-05 2018-07-10 烽火通信科技股份有限公司 一种栈溢出检测系统及方法
CN110442504A (zh) * 2019-08-02 2019-11-12 中国工商银行股份有限公司 基于调用栈分析的性能测试方法和装置
CN111813465A (zh) * 2020-06-19 2020-10-23 北京字节跳动网络技术有限公司 一种信息获取方法、装置、介质和设备
CN112000484A (zh) * 2020-09-01 2020-11-27 北京元心科技有限公司 栈帧地址随机化方法及相关设备

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
Building stack traces from memory dump of Windows x64;Yuto Otsuki et al.;ScienceDirect;20180331;第24卷;全文 *
Linux系统调用跟踪和进程错误退出分析;毛英明等;《计算机工程与应用》;20181026;55(6);全文 *
基于指针概念理解JAVA知识点;王建红;;电脑迷;20160815(第08期);全文 *

Also Published As

Publication number Publication date
CN112925717A (zh) 2021-06-08
WO2022199283A1 (zh) 2022-09-29

Similar Documents

Publication Publication Date Title
CN112925717B (zh) 用于确定调用栈栈帧的对象的方法、装置、设备和介质
CN106598655B (zh) 应用程序页面处理方法和装置
CN112925718B (zh) 调用栈回溯方法、装置、设备和介质
WO2018077085A1 (zh) 应用程序处理方法、装置及存储介质
CN108228293B (zh) 一种界面皮肤切换方法及装置
CN104572042A (zh) 移动终端设备的跨平台中间件装置及其实现方法
CN112181554B (zh) 一种交互界面显示方法、设备、电子设备及存储介质
CN108647032B (zh) 应用加载方法及装置、计算机装置和计算机可读存储介质
JP7106001B2 (ja) サブアプリケーション開発方法、装置、コンピュータ機器、並びにコンピュータプログラム
CN109361948B (zh) 界面管理方法、智能终端及可读存储介质
CN109684573B (zh) 目标图片显示方法及装置、存储介质、电子设备
CN111796896A (zh) 应用页面的主题切换方法及相关设备
CN104699503A (zh) 一种替换安卓系统中函数的执行逻辑的方法及装置
CN111367518A (zh) 页面布局方法、装置、计算设备及计算机存储介质
CN112016023A (zh) 业务处理方法、装置、终端及存储介质
CN113778391A (zh) 原生应用程序的页面处理方法、装置及设备
CN108600838B (zh) Android电视的信源切换方法、装置、Android电视及可读存储介质
CN108268298B (zh) 桌面图标的生成方法、装置、存储介质及电子设备
CN111124627A (zh) 应用程序的调起者确定方法、装置、终端及存储介质
CN114090083B (zh) 一种可视化组件配置方法、装置、设备及存储介质
CN114356290A (zh) 一种数据处理方法、装置及计算机可读存储介质
CN115437551A (zh) 数据克隆的方法、设备、存储介质及计算机程序产品
CN113296841A (zh) 应用程序处理方法、装置、设备及介质
KR100948472B1 (ko) 데이터 언어에서 변수들의 자동 업데이팅
CN108279937B (zh) 参数的调用方法、装置、存储介质及电子设备

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant