CN112925718B - 调用栈回溯方法、装置、设备和介质 - Google Patents
调用栈回溯方法、装置、设备和介质 Download PDFInfo
- Publication number
- CN112925718B CN112925718B CN202110303889.0A CN202110303889A CN112925718B CN 112925718 B CN112925718 B CN 112925718B CN 202110303889 A CN202110303889 A CN 202110303889A CN 112925718 B CN112925718 B CN 112925718B
- Authority
- CN
- China
- Prior art keywords
- function module
- backtracking
- stack
- address
- code segment
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging using diagnostics
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)
- Debugging And Monitoring (AREA)
Abstract
本公开实施例涉及一种调用栈回溯方法、装置、设备和介质,其中,该方法包括:申请第一内存区域,并确定其目标子区域;执行构造功能模块对应的代码段,对目标子区域中存储的内容进行初始化;将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;该表中的第三个功能模块地址为预设目标回调功能模块的地址;基于第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;在调用栈的回溯过程中,执行预设目标回调功能模块对应的代码段,并确定执行次数;根据该执行次数,确定是否结束调用栈的回溯。本公开实施例实现了在程序运行过程中对栈回溯的有效控制,达到了控制栈回溯次数的效果,降低了栈回溯的耗时。
Description
技术领域
本公开涉及计算机技术领域,尤其涉及一种调用栈回溯方法、装置、设备和介质。
背景技术
在应用程序的运行过程中,通常涉及到调用栈(Call stack)的回溯。通过栈回溯,可以获取需求的栈帧信息,以用于定位和分析程序运行过程中的异常。
在现有栈回溯方案中,通常直接调用系统函数getStackTrace来实现。然而,整个栈回溯过程不可控,需要执行所有栈帧的回溯(即全量栈回溯)后,才能结束,导致栈回溯耗时较长。
发明内容
为了解决上述技术问题或者至少部分地解决上述技术问题,本公开实施例提供了一种调用栈回溯方法、装置、设备和介质。
第一方面,本公开实施例提供了一种调用栈回溯方法,包括:
申请第一内存区域,并确定所述第一内存区域中的目标子区域;其中,所述目标子区域是所述第一内存区域的首地址对应的区域;
获取上下文参数和当前线程指针;
基于所述第一内存区域的首地址、所述上下文参数和所述当前线程指针,执行构造功能模块对应的代码段,对所述目标子区域中存储的内容进行初始化;
将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,所述自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;
基于所述第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;
在所述调用栈的回溯过程中,执行所述预设目标回调功能模块对应的代码段,并确定所述预设目标回调功能模块对应的代码段的执行次数;
根据所述预设目标回调功能模块对应的代码段的执行次数,确定是否结束所述调用栈的回溯。
第二方面,本公开实施例还提供了一种调用栈回溯装置,包括:
内存区域申请模块,用于申请第一内存区域,并确定所述第一内存区域中的目标子区域;其中,所述目标子区域是所述第一内存区域的首地址对应的区域;
参数获取模块,用于获取上下文参数和当前线程指针;
内容初始化模块,用于基于所述第一内存区域的首地址、所述上下文参数和所述当前线程指针,执行构造功能模块对应的代码段,对所述目标子区域中存储的内容进行初始化;
内容更改模块,用于将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,所述自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;
第一执行模块,用于基于所述第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;
第二执行模块,用于在所述调用栈的回溯过程中,执行所述预设目标回调功能模块对应的代码段,并确定所述预设目标回调功能模块对应的代码段的执行次数;
栈回溯确定模块,用于根据所述预设目标回调功能模块对应的代码段的执行次数,确定是否结束所述调用栈的回溯。
第三方面,本公开实施例还提供了一种电子设备,包括存储器和处理器,其中,所述存储器中存储有计算机程序,当所述计算机程序被所述处理器执行时,使得所述电子设备实现本公开实施例提供的任一所述的调用栈回溯方法。
第四方面,本公开实施例还提供了一种计算机可读存储介质,所述存储介质中存储有计算机程序,当所述计算机程序被计算设备执行时,使得所述计算设备实现本公开实施例提供的任一所述的调用栈回溯方法。
本公开实施例提供的技术方案与现有技术相比至少具有如下优点:在本公开实施例中,首先申请第一内存区域,并确定第一内存区域的首地址对应的目标子区域,然后通过内容初始化和存储内容更改操作,实现将目标子区域中的存储内容确定为自定义虚拟功能模块表的地址,该表中的第三个功能模块地址为预设目标回调功能模块的地址;其次,基于第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯,在具体执行栈回溯功能模块WalkStack对应的代码段的过程中,可以通过第一内存区域的首地址,找到预设目标回调功能模块的地址,从而在调用栈的回溯过程中,执行预设目标回调功能模块对应的代码段,并确定其执行次数;进而根据该执行次数,确定是否结束调用栈的回溯。本公开实施例解决了现有栈回溯方案中只能实现全量栈回溯导致栈回溯耗时的问题,实现了在程序运行过程中对栈回溯的有效控制,达到了控制栈回溯次数的效果,降低了栈回溯的耗时。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本公开实施例提供的一种调用栈回溯方法的流程图;
图2为本公开实施例提供的一种调用栈回溯过程中关于初始化的流程图;
图3为本公开实施例提供的一种关于目标子区域的存储内容更改前和更改后的对比示意图;
图4为本公开实施例提供的另一种调用栈回溯方法的流程图;
图5为本公开实施例提供的一种调用栈回溯装置的结构示意图;
图6为本公开实施例提供的一种电子设备的结构示意图。
具体实施方式
为了能够更清楚地理解本公开的上述目的、特征和优点,下面将对本公开的方案进行进一步描述。需要说明的是,在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合。
在下面的描述中阐述了很多具体细节以便于充分理解本公开,但本公开还可以采用其他不同于在此描述的方式来实施;显然,说明书中的实施例只是本公开的一部分实施例,而不是全部的实施例。
在现有方案中,如果应用程序运行过程中,需要执行调用栈的回溯(可以简称为栈回溯),通常是直接调用设备系统提供的调用栈获取函数getStackTrace获取调用栈。在调用栈获取函数getStackTrace的实现过程中,通常包括多个执行步骤,执行步骤的次数与调用栈中包括的栈帧(Stack Frame)的数量有关。由于设备系统暴露给外界(例如开发者)的入口只有调用栈获取函数getStackTrace对应的函数入口,所以在调用该函数获取调用栈的过程中,需要把该函数实现过程中包括的多个步骤全部执行结束(即全量栈回溯)后,才可以结束栈回溯。
然而,在实际应用中,并非调用栈中各个栈帧的信息都是需求的信息。示例性地,在调用栈获取函数getStackTrace的实现过程中,包括10个执行步骤,而实际需求的可能只有前面3个步骤的执行结果(即前面3个栈帧的信息),对剩余7个步骤的执行结果并不关注,所以本公开实施例技术方案的核心之一即在于如何对栈回溯进行合理控制,使得栈回溯过程执行的步骤次数有限,省去其他非必须的执行步骤,换言之,即实现自由控制回溯的栈帧的数量,降低栈回溯的耗时。
图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、确定方法指针获取函数(GetMethod)。方法指针获取函数(GetMethod)用于获取调用栈中栈帧的方法指针。
S1207、确定指令偏移值获取函数(GetDexPc)。指令偏移值获取函数(GetDexPc)用于获取调用栈中栈帧的指令偏移值。
S1208、确定方法描述信息获取函数(PrettyMethod)。方法描述信息获取函数(PrettyMethod)用于获取方法指针对应的描述信息。
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、根据预设目标回调功能模块对应的代码段的执行次数,确定是否结束调用栈的回溯。
示例性地,可以首先确定预设目标回调功能模块对应的代码段的执行次数阈值,该执行次数阈值可以是预先设置的定值,也可以是在程序运行过程中可自动化调整的一个值,本公开实施例对此不作具体限定;如果预设目标回调功能模块对应的代码段的执行次数达到执行次数阈值,则基于执行预设目标回调功能模块对应的代码段得到的目标结果,例如目标结果为false,结束调用栈的回溯;如果预设目标回调功能模块对应的代码段的执行次数未达到执行次数阈值,则基于执行预设目标回调功能模块对应的代码段得到的其他结果,例如其他结果为true,继续调用栈的回溯,从而实现合理控制栈帧的回溯数量。
进一步可选地,确定预设目标回调功能模块对应的代码段的执行次数阈值,包括:
获取预先设置的预设目标回调功能模块对应的代码段的执行次数阈值;即执行次数阈值可以是一个在构造程序代码阶段所预先设置的值;或者
获取当前运行的线程的类型,并根据线程的类型,确定预设目标回调功能模块对应的代码段的执行次数阈值;其中,线程的类型包括主线程或子线程;例如当采用现有方案中可用的线程类型确定方式确定当前运行的线程的类型为主线程,则可以将执行次数阈值设置为第一值,如果确定当前运行的线程的类型为子线程,则可以将执行次数阈值设置为第二值,第一值大于第二值,但本公开实施例对两者的具体取值不作限定。主线程的优先级高于子线程,主线程对应的执行次数阈值较大,相应地可以执行较多栈帧的回溯,有助于获取较多的栈帧信息,子线程对应的执行次数阈值较小,相应地可以执行较少栈帧的回溯,达到合理控制栈回溯的耗时。
或者
获取应用程序的当前运行状态信息,并根据当前运行状态信息,确定预设目标回调功能模块对应的代码段的执行次数阈值;其中,当前运行状态信息包括运行正常或者运行异常。例如,如果应用程序的当前运行状态信息为运行正常,则可以将执行次数阈值设置为第三值,如果应用程序的当前运行状态信息为运行异常,则可以将执行次数阈值设置为第四值,第四值大于第三值,但本公开实施例对两者的具体取值不作限定。在程序运行正常情况下,由于不需要使用较多的栈帧信息进行应用程序的异常分析与定位,可以进行较少栈帧的回溯,但是在程序运行异常情况下,由于需要使用较多的栈帧信息进行应用程序的异常分析与定位,因此可以进行较多栈帧的回溯。
在本公开实施例中,预设目标回调功能模块对应的代码段的执行次数阈值可以采用多种方式实现灵活确定,相应地栈帧回溯数量可以灵活调整,从而实现对整个栈回溯的有效控制。
在本公开实施例中,首先申请第一内存区域,并确定第一内存区域的首地址对应的目标子区域,然后通过内容初始化和存储内容更改操作,实现将目标子区域中的存储内容确定为自定义虚拟功能模块表的地址,该表中的第三个功能模块地址为预设目标回调功能模块的地址;其次,基于第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯,在具体执行栈回溯功能模块WalkStack对应的代码段的过程中,可以通过第一内存区域的首地址,找到预设目标回调功能模块的地址,从而在调用栈的回溯过程中,执行预设目标回调功能模块对应的代码段,并确定其执行次数;进而根据该执行次数,确定是否结束调用栈的回溯。本公开实施例解决了现有栈回溯方案中只能实现全量栈回溯导致栈回溯耗时的问题,实现了在程序运行过程中对栈回溯的有效控制,达到了控制栈回溯次数的效果,降低了栈回溯的耗时。
在上述技术方案的基础上,可选地,本公开实施例提供的调用栈回溯方法还可以包括:在执行预设目标回调功能模块对应的代码段的过程中,基于第一内存区域的首地址,执行目标信息获取功能模块对应的代码段,以获取目标信息;其中,目标信息获取功能模块包括方法指针获取功能模块GetMethod和/或指令偏移值获取功能模块GetDexPc,相应地,目标信息包括方法指针ArtMethod和/或方法指针对应的指令偏移值DexPc。
从计算机程序执行流程的角度而言,执行预设目标回调功能模块对应的代码段即执行预设目标回调函数,执行目标信息获取功能模块对应的代码段即执行目标信息获取函数。目标信息获取函数属于在预设目标回调函数的执行过程中被嵌套执行的函数。
具体地,每个回溯出一个栈帧,在执行预设目标回调函数的过程中,可以基于第一内存区域的首地址确定第一内存区域中的目标子区域,进而可以根据目标子区域中存储的自定义虚拟函数表,确定预设目标回调函数的地址,使得目标信息获取函数保持在预设目标回调函数的执行周期中执行。针对每个栈帧,在执行预设目标回调函数的过程中,通过执行方法指针获取函数GetMethod和/或指令偏移值获取函数GetDexPc,可以相应得到栈帧的方法指针ArtMethod和/或该方法指针对应的指令偏移值DexPc。并且,方法指针ArtMethod可以用于获取栈帧的方法名、栈帧方法所在类名、栈帧对应的源码文件名中的至少之一,指令偏移值DexPc可以用于获取栈帧对应的源码行号。
本公开实施例通过合理控制栈帧的回溯数量,针对性地获取有限数量的栈帧的信息,极大节省了栈回溯的时间,提高了栈回溯的效率。
在一种可选实施方式中,在执行方法指针获取功能模块GetMethod对应的代码段之后,本公开实施例提供的调用栈回溯方法还包括:基于获取的方法指针,执行方法描述信息获取功能模块PrettyMethod对应的代码段,获取方法指针对应的描述信息。继续从计算机程序执行流程的角度而言,执行方法描述信息获取功能模块PrettyMethod对应的代码段,即执行方法描述信息获取函数PrettyMethod,可以获取当前方法指针对应的描述信息(或称为字符串描述信息strArtMethod),包括但不限于方法的返回值类型、方法的参数类型、方法所在类名、方法名等。
进一步地,方法指针对应的描述信息包括方法指针对应的方法所在类名,本公开实施例提供的调用栈回溯方法还包括:
获取预先确定的类名列表;其中,类名列表用于记录无需获取指令偏移值的方法指针对应的类名;示例性地,该类名列表可以是在构造程序代码的过程中预先设置,也可以在程序运行过程中按照特定的类名筛选规则进行确定,类名筛选规则的具体内容可以灵活设置,本公开实施例不作具体限定,例如按照程序运行过程中涉及的类名的优先级,将优先级较低的类名记录在该类名列表中;
将描述信息中包括的方法所在类名与类名列表进行匹配,以在匹配不成功的情况下,执行指令偏移值获取功能模块GetDexPc对应的代码段。
针对在先执行方法指针获取函数GetMethod,在后执行指令偏移值获取函数GetDexPc的情况,执行方法描述信息获取函数PrettyMethod得到的描述信息中,如果包括的方法所在类名与类名列表匹配成功,则表示当前描述信息中包括的方法所在类名下的方法指针,不需要进一步获取对应的指令偏移值;如果描述信息中包括的方法所在类名与类名列表匹配不成功,则表示当前描述信息中包括的方法所在类名下的方法指针,需要进一步获取对应的指令偏移值。即本公开实施例可以通过获取的方法所在类名与类名列表,对指令偏移值获取功能模块GetDexPc对应的代码段的执行情况(或称为对指令偏移值获取函数GetDexPc的执行情况)进行再次地控制,减少对非关注信息的获取,减少对计算资源的占用,进一步有助于提高栈回溯的效率。
在一种可选实施方式中,基于第一内存区域的首地址,执行目标信息获取功能模块对应的代码段,包括:
基于预设目标回调功能模块对应的代码段的执行次数,确定当前回溯的栈帧的层级;
如果当前回溯的栈帧的层级属于预设需求层级,则基于第一内存区域的首地址,执行目标信息获取功能模块对应的代码段,预设需求层级用于定义需要获取栈帧信息的栈帧所属的层级。
在本公开实施例中,预设目标回调功能模块对应的代码段的执行次数(或者预设目标回调函数的执行次数)与当前回溯的栈帧的层级存在对应关系,例如预设目标回调函数的执行次数为N,则表示当前回溯的栈帧的层级为N。如果当前回溯的栈帧的层级属于预设需求层级,则执行目标信息获取功能模块对应的代码段,以实现获取栈帧的目标信息,否则不需要执行。预设需求层级可以在构造程序代码阶段进行预先确定,也可以在程序运行过程中按照设定规则进行动态确定,设定规则可以根据不同的应用程序进行适应性确定,本公开实施例不作具体限定,例如可以在应用程序运行过程中,将调用栈中属于偶数或奇数的栈帧层级确定为预设需求层级等。
本公开实施例不仅可以实现有效控制回溯的栈帧的数量,提高栈回溯效率,还可以实现获取调用栈中非连续的若干个栈帧的信息。
示例性地,在当前栈回溯过程中,只关注调用栈中第3个栈帧和第5个栈帧的详细信息,预设需求层级的最大值决定了栈帧回溯的数量,即当前需要执行的栈回溯次数为5次,也即预设目标回调功能模块对应的代码段的执行次数为5次,则在执行预设目标回调功能模块对应的代码段的过程中,可以基于预设目标回调功能模块对应的代码段的执行次数,确定当前回溯的栈帧的层级,并在回溯出第3个栈帧和第5个栈帧的情况下,才会执行目标信息获取功能模块对应的代码段,同时在回溯出第5个栈帧之后停止栈回溯。此外,如果目标信息获取功能模块包括方法指针获取功能模块GetMethod,则在执行方法指针获取功能模块GetMethod对应的代码段后,还可以执行方法描述信息获取功能模块PrettyMethod对应的代码段,以获取方法指针对应的描述信息。
虽然在整个栈回溯过程中,对于第1个、第2个、第4个栈帧,也进行了回溯,但是并没有执行目标信息获取功能模块对应的代码段,以获取这些栈帧的详细信息,相比于获取全部5个栈帧的详细信息的情况,选择性地获取2个栈帧的详细信息的执行时间更短,因而能够更快地完成栈回溯。
图4为本公开实施例提供的另一种调用栈回溯方法的流程图,用于从计算机程序执行流程的角度,对本公开实施例进行示例性说明,但不应理解为对本公开实施例的具体限定。并且,在构造程序代码过程中,本公开实施例中自定义的预设目标回调函数callback的函数名可以示例性地采用myVisitFrame表示。
如图4所示,本公开实施例提供的调用栈回溯方法可以包括:
S401、开始。
S402、调用线程指针获取函数CurrentFromGdb,并确定其返回值,即当前线程指针currentThread。
S403、调用上下文参数获取函数ContextCreate,并确定其返回值,即上下文参数context。
S404、申请一块连续内存区域,并确定该内存区域的首地址myVisitor。
S405、将内存区域的首地址myVisitor作为第一个参数,将当前线程指针currentThread作为第二个参数,将上下文参数context作为第三个参数,调用构造函数StackVisitorC,将内存区域的首地址myVisitor构造成真正的访问者Visitor对象(或称为指针)。
S406、将指针myVisitor对应的目标子区域中存储内容的类型强转为指针类型,并更改该指针myVisitor指向的内容,使其指向自定义的虚拟函数表,自定义的虚拟函数表中第三个指针指向自定义的目标回调函数myVisitFrame。
S407、将指针myVisitor作为第一参数调用栈回溯函数WalkStack。
通过调用栈回溯函数WalkStack,启动调用栈的回溯。
S408、确定是否回溯出一个栈帧。
如果是,则执行S409,如果否,则结束流程。
S409、调用自定义的目标回调函数myVisitFrame。
以下操作S410-S416属于在目标回调函数myVisitFrame的执行过程中需执行的操作。
S410、将指针myVisitor作为参数调用方法指针获取函数GetMetho,并获取其返回值,即当前栈帧的方法指针ArtMethod。
S411、将当前方法指针ArtMethod作为参数调用方法描述信息获取函数PrettyMethod,并获取其返回值,即当前方法指针ArtMethod的字符串描述信息strArtMethod。
S412、将指针myVisitor作为参数调用指令偏移值获取函数GetDexPc,并获取其返回值,即当前栈帧的指令偏移值DexPc。
S413、记录当前栈帧的方法指针ArtMethod和指令偏移值DexPc,作为当前栈帧的信息。
S414、确定回溯的栈帧数量是否达到目标数量。
其中,目标数量即目标回调函数myVisitFrame的执行次数阈值。如果确定回溯的栈帧数量未达到目标数量,则确定目标回调函数myVisitFrame的返回值为true,表示调用栈的回溯继续执行;如果确定回溯的栈帧数量达到目标数量,则确定目标回调函数myVisitFrame的返回值为false,表示调用栈的回溯可以结束。
S415、返回false。
S416、返回true。
S417、确定自定义的目标回调函数myVisitFrame的返回值是否为true。
如果确定返回值为true,则继续执行栈回溯;如果确定返回值不是true,而是false,则结束栈回溯。
S418、结束。
需要说明的是,操作S410、S411和S412的执行,可以根据栈帧信息的获取需求而定,图4作为示例,示出了三个操作的执行,但不应理解为对本公开实施例的具体限定。在具体应用中,可以根据需求对三个操作进行选择性执行。
本公开实施例通过调用系统中栈回溯的一部分步骤,以及更改虚拟函数表的方式,解决了现有栈回溯方案中只能实现全量栈回溯导致栈回溯耗时的问题,实现了在程序运行过程中对栈回溯的有效控制,达到了控制栈回溯次数的效果,降低了栈回溯的耗时。
图5为本公开实施例提供的一种调用栈回溯装置的结构示意图,该装置可以采用软件和/或硬件实现,并可集成在具有计算能力的电子设备上,例如移动终端、笔记本、电脑等。
如图5所示,本公开实施例提供的调用栈回溯装置500可以包括内存区域申请模块501、参数获取模块502、内容初始化模块503、内容更改模块504、第一执行模块505、第二执行模块506和栈回溯确定模块507,其中:
内存区域申请模块501,用于申请第一内存区域,并确定第一内存区域中的目标子区域;其中,目标子区域是第一内存区域的首地址对应的区域;
参数获取模块502,用于获取上下文参数和当前线程指针;
内容初始化模块503,用于基于第一内存区域的首地址、上下文参数和当前线程指针,执行构造功能模块对应的代码段,对目标子区域中存储的内容进行初始化;
内容更改模块504,用于将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;
第一执行模块505,用于基于第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;
第二执行模块506,用于在调用栈的回溯过程中,执行预设目标回调功能模块对应的代码段,并确定预设目标回调功能模块对应的代码段的执行次数;
栈回溯确定模块507,用于根据预设目标回调功能模块对应的代码段的执行次数,确定是否结束调用栈的回溯。
可选地,本公开实施例提供的调用栈回溯装置500还包括:
第三执行模块,用于在执行预设目标回调功能模块对应的代码段的过程中,基于第一内存区域的首地址,执行目标信息获取功能模块对应的代码段,以获取目标信息;其中,目标信息获取功能模块包括方法指针获取功能模块GetMethod和/或指令偏移值获取功能模块GetDexPc。
可选地,本公开实施例提供的调用栈回溯装置500还包括:
执行次数阈值确定模块,用于确定预设目标回调功能模块对应的代码段的执行次数阈值;
相应地,栈回溯确定模块507具体用于:
如果预设目标回调功能模块对应的代码段的执行次数达到执行次数阈值,则基于执行预设目标回调功能模块对应的代码段得到的目标结果,结束调用栈的回溯。
可选地,执行次数阈值确定模块包括:
获取单元,用于获取预先设置的预设目标回调功能模块对应的代码段的执行次数阈值;
或者
第一确定单元,用于获取当前运行的线程的类型,并根据线程的类型,确定预设目标回调功能模块对应的代码段的执行次数阈值;其中,线程的类型包括主线程或子线程;
或者
第二确定单元,用于获取应用程序的当前运行状态信息,并根据当前运行状态信息,确定预设目标回调功能模块对应的代码段的执行次数阈值;其中,当前运行状态信息包括运行正常或者运行异常。
可选地,本公开实施例提供的调用栈回溯装置500还包括:
第四执行模块,用于在第三执行模块执行方法指针获取功能模块GetMethod对应的代码段之后,基于获取的方法指针,执行方法描述信息获取功能模块PrettyMethod对应的代码段,获取方法指针对应的描述信息。
可选地,方法指针对应的描述信息包括方法指针对应的方法所在类名,本公开实施例提供的调用栈回溯装置500还包括:
类名列表获取模块,用于获取预先确定的类名列表;其中,类名列表用于记录无需获取指令偏移值的方法指针对应的类名;
类名匹配模块,用于将描述信息中包括的方法所在类名与类名列表进行匹配,以在匹配不成功的情况下,执行指令偏移值获取功能模块GetDexPc对应的代码段。
可选地,第二执行模块506包括:
栈帧层级确定单元,用于基于预设目标回调功能模块对应的代码段的执行次数,确定当前回溯的栈帧的层级;
代码执行单元,用于如果当前回溯的栈帧的层级属于预设需求层级,则基于第一内存区域的首地址,执行目标信息获取功能模块对应的代码段。
本公开实施例所提供的调用栈回溯装置可执行本公开实施例所提供的任意调用栈回溯方法,具备执行方法相应的功能模块和有益效果。本公开装置实施例中未详尽描述的内容可以参考本公开任意方法实施例中的描述。
图6为本公开实施例提供的一种电子设备的结构示意图,用于对实现本公开实施例提供的调用栈回溯方法的电子设备进行示例性说明。本公开实施例中的电子设备可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、PDA(个人数字助理)、PAD(平板电脑)、PMP(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字TV、台式计算机、智能家居设备、可穿戴电子设备、服务器等等的固定终端。图6示出的电子设备仅仅是一个示例,不应对本公开实施例的功能和占用范围带来任何限制。
如图6所示,电子设备600包括一个或多个处理器601和存储器602。处理器601可以是中央处理单元(CPU)或者具有数据处理能力和/或指令执行能力的其他形式的处理单元,并且可以控制电子设备600中的其他组件以执行期望的功能。
存储器602可以包括一个或多个计算机程序产品,计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。易失性存储器例如可以包括随机存取存储器(RAM)和/或高速缓冲存储器(cache)等。非易失性存储器例如可以包括只读存储器(ROM)、硬盘、闪存等。在计算机可读存储介质上可以存储一个或多个计算机程序指令,处理器601可以运行程序指令,以实现本公开实施例提供的调用栈回溯方法,还可以实现其他期望的功能。在计算机可读存储介质中还可以存储诸如输入信号、信号分量、噪声分量等各种内容。
其中,本公开实施例提供的调用栈回溯方法可以包括:申请第一内存区域,并确定第一内存区域中的目标子区域;其中,目标子区域是第一内存区域的首地址对应的区域;获取上下文参数和当前线程指针;基于第一内存区域的首地址、上下文参数和当前线程指针,执行构造功能模块对应的代码段,对目标子区域中存储的内容进行初始化;将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;基于第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;在调用栈的回溯过程中,执行预设目标回调功能模块对应的代码段,并确定预设目标回调功能模块对应的代码段的执行次数;根据预设目标回调功能模块对应的代码段的执行次数,确定是否结束调用栈的回溯。应当理解,电子设备600还可以执行本公开方法实施例提供的其他可选实施方案。
在一个示例中,电子设备600还可以包括:输入装置603和输出装置604,这些组件通过总线系统和/或其他形式的连接机构(未示出)互连。
此外,该输入装置603还可以包括例如键盘、鼠标等等。
该输出装置604可以向外部输出各种信息,包括确定出的距离信息、方向信息等。该输出装置604可以包括例如显示器、扬声器、打印机、以及通信网络及其所连接的远程输出设备等等。
当然,为了简化,图6中仅示出了该电子设备600中与本公开有关的组件中的一些,省略了诸如总线、输入/输出接口等等的组件。除此之外,根据具体应用情况,电子设备600还可以包括任何其他适当的组件。
除了上述方法和设备以外,本公开实施例还提供一种计算机程序产品,其包括计算机程序或计算机程序指令,计算机程序或计算机程序指令在被计算设备执行时使得计算设备实现本公开实施例所提供的任意调用栈回溯方法。
计算机程序产品可以以一种或多种程序设计语言的任意组合来编写用于执行本公开实施例操作的程序代码,程序设计语言包括面向对象的程序设计语言,诸如Java、C++等,还包括常规的过程式程序设计语言,诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户电子设备上执行、部分地在用户电子设备上执行、作为一个独立的软件包执行、部分在用户电子设备上且部分在远程电子设备上执行、或者完全在远程电子设备上执行。
此外,本公开实施例还可以提供一种计算机可读存储介质,其上存储有计算机程序指令,计算机程序指令在被计算设备执行时使得计算设备实现本公开实施例所提供的任意调用栈回溯方法。
其中,本公开实施例提供的调用栈回溯方法可以包括:申请第一内存区域,并确定第一内存区域中的目标子区域;其中,目标子区域是第一内存区域的首地址对应的区域;获取上下文参数和当前线程指针;基于第一内存区域的首地址、上下文参数和当前线程指针,执行构造功能模块对应的代码段,对目标子区域中存储的内容进行初始化;将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;基于第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;在调用栈的回溯过程中,执行预设目标回调功能模块对应的代码段,并确定预设目标回调功能模块对应的代码段的执行次数;根据预设目标回调功能模块对应的代码段的执行次数,确定是否结束调用栈的回溯。应当理解,计算机程序指令在被计算设备执行时,还可以使得计算设备实现本公开方法实施例提供的其他可选实施方案。
计算机可读存储介质可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以包括但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上仅是本公开的具体实施方式,使本领域技术人员能够理解或实现本公开。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本公开的精神或范围的情况下,在其它实施例中实现。因此,本公开将不会被限制于本文的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (10)
1.一种调用栈回溯方法,其特征在于,包括:
申请第一内存区域,并确定所述第一内存区域中的目标子区域;其中,所述目标子区域是所述第一内存区域的首地址对应的区域;
获取上下文参数和当前线程指针;
基于所述第一内存区域的首地址、所述上下文参数和所述当前线程指针,执行构造功能模块对应的代码段,对所述目标子区域中存储的内容进行初始化;
将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,所述自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;
基于所述第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;
在所述调用栈的回溯过程中,执行所述预设目标回调功能模块对应的代码段,并确定所述预设目标回调功能模块对应的代码段的执行次数;
根据所述预设目标回调功能模块对应的代码段的执行次数,确定是否结束所述调用栈的回溯。
2.根据权利要求1所述的方法,其特征在于,还包括:
在执行所述预设目标回调功能模块对应的代码段的过程中,基于所述第一内存区域的首地址,执行目标信息获取功能模块对应的代码段,以获取目标信息;其中,所述目标信息获取功能模块包括方法指针获取功能模块GetMethod和/或指令偏移值获取功能模块GetDexPc。
3.根据权利要求1所述的方法,其特征在于,还包括:
确定所述预设目标回调功能模块对应的代码段的执行次数阈值;
相应地,根据所述预设目标回调功能模块对应的代码段的执行次数,确定是否结束所述调用栈的回溯,包括:
如果所述预设目标回调功能模块对应的代码段的执行次数达到所述执行次数阈值,则基于执行所述预设目标回调功能模块对应的代码段得到的目标结果,结束所述调用栈的回溯。
4.根据权利要求3所述的方法,其特征在于,确定所述预设目标回调功能模块对应的代码段的执行次数阈值,包括:
获取预先设置的所述预设目标回调功能模块对应的代码段的执行次数阈值;
或者
获取当前运行的线程的类型,并根据所述线程的类型,确定所述预设目标回调功能模块对应的代码段的执行次数阈值;其中,所述线程的类型包括主线程或子线程;
或者
获取应用程序的当前运行状态信息,并根据所述当前运行状态信息,确定所述预设目标回调功能模块对应的代码段的执行次数阈值;其中,所述当前运行状态信息包括运行正常或者运行异常。
5.根据权利要求2所述的方法,其特征在于,在执行所述方法指针获取功能模块GetMethod对应的代码段之后,还包括:
基于获取的方法指针,执行方法描述信息获取功能模块PrettyMethod对应的代码段,获取所述方法指针对应的描述信息。
6.根据权利要求5所述的方法,其特征在于,所述描述信息包括所述方法指针对应的方法所在类名,所述方法还包括:
获取预先确定的类名列表;其中,所述类名列表用于记录无需获取指令偏移值的方法指针对应的类名;
将所述描述信息中包括的方法所在类名与所述类名列表进行匹配,以在匹配不成功的情况下,执行所述指令偏移值获取功能模块GetDexPc对应的代码段。
7.根据权利要求1所述的方法,其特征在于,基于所述第一内存区域的首地址,执行目标信息获取功能模块对应的代码段,包括:
基于所述预设目标回调功能模块对应的代码段的执行次数,确定当前回溯的栈帧的层级;
如果所述当前回溯的栈帧的层级属于预设需求层级,则基于所述第一内存区域的首地址,执行目标信息获取功能模块对应的代码段。
8.一种调用栈回溯装置,其特征在于,包括:
内存区域申请模块,用于申请第一内存区域,并确定所述第一内存区域中的目标子区域;其中,所述目标子区域是所述第一内存区域的首地址对应的区域;
参数获取模块,用于获取上下文参数和当前线程指针;
内容初始化模块,用于基于所述第一内存区域的首地址、所述上下文参数和所述当前线程指针,执行构造功能模块对应的代码段,对所述目标子区域中存储的内容进行初始化;
内容更改模块,用于将初始化后的目标子区域中的存储内容更改为自定义虚拟功能模块表的地址;其中,所述自定义虚拟功能模块表中的第三个功能模块地址为预设目标回调功能模块的地址;
第一执行模块,用于基于所述第一内存区域的首地址,执行栈回溯功能模块WalkStack对应的代码段,以启动调用栈的回溯;
第二执行模块,用于在所述调用栈的回溯过程中,执行所述预设目标回调功能模块对应的代码段,并确定所述预设目标回调功能模块对应的代码段的执行次数;
栈回溯确定模块,用于根据所述预设目标回调功能模块对应的代码段的执行次数,确定是否结束所述调用栈的回溯。
9.一种电子设备,其特征在于,包括存储器和处理器,其中,所述存储器中存储有计算机程序,当所述计算机程序被所述处理器执行时,使得所述电子设备实现权利要求1-7中任一项所述的调用栈回溯方法。
10.一种计算机可读存储介质,其特征在于,所述存储介质中存储有计算机程序,当所述计算机程序被计算设备执行时,使得所述计算设备实现权利要求1-7中任一项所述的调用栈回溯方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110303889.0A CN112925718B (zh) | 2021-03-22 | 2021-03-22 | 调用栈回溯方法、装置、设备和介质 |
PCT/CN2022/076545 WO2022199284A1 (zh) | 2021-03-22 | 2022-02-17 | 调用栈回溯方法、装置、设备和介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110303889.0A CN112925718B (zh) | 2021-03-22 | 2021-03-22 | 调用栈回溯方法、装置、设备和介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112925718A CN112925718A (zh) | 2021-06-08 |
CN112925718B true CN112925718B (zh) | 2023-10-20 |
Family
ID=76175398
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110303889.0A Active CN112925718B (zh) | 2021-03-22 | 2021-03-22 | 调用栈回溯方法、装置、设备和介质 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN112925718B (zh) |
WO (1) | WO2022199284A1 (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112925718B (zh) * | 2021-03-22 | 2023-10-20 | 北京字节跳动网络技术有限公司 | 调用栈回溯方法、装置、设备和介质 |
CN116521576B (zh) * | 2023-05-11 | 2024-03-08 | 上海合见工业软件集团有限公司 | Eda软件数据处理系统 |
CN117195204B (zh) * | 2023-11-01 | 2024-02-13 | 建信金融科技有限责任公司 | 异常数据检测方法、装置、电子设备及计算机可读介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103839007A (zh) * | 2014-03-03 | 2014-06-04 | 珠海市君天电子科技有限公司 | 一种检测异常线程的方法及系统 |
CN108984328A (zh) * | 2017-05-31 | 2018-12-11 | 中兴通讯股份有限公司 | 一种堆栈回溯的方法及装置 |
CN109901915A (zh) * | 2019-01-18 | 2019-06-18 | 江苏艾佳家居用品有限公司 | 一种分布式服务框架中的全链路堆栈信息跟踪方法 |
CN110502357A (zh) * | 2019-07-09 | 2019-11-26 | 北京字节跳动网络技术有限公司 | 一种栈回溯方法、装置、介质和设备 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7673182B2 (en) * | 2006-06-22 | 2010-03-02 | International Business Machines Corporation | Method and apparatus for obtaining stack traceback data for multiple computing nodes of a massively parallel computer system |
CN101539883B (zh) * | 2009-05-05 | 2011-11-16 | 北京和利时系统工程有限公司 | 嵌入式系统的错误追踪方法和装置 |
US11294682B2 (en) * | 2019-05-20 | 2022-04-05 | Microsoft Technology Licensing, Llc | Stack traces using shadow stack |
CN112925718B (zh) * | 2021-03-22 | 2023-10-20 | 北京字节跳动网络技术有限公司 | 调用栈回溯方法、装置、设备和介质 |
-
2021
- 2021-03-22 CN CN202110303889.0A patent/CN112925718B/zh active Active
-
2022
- 2022-02-17 WO PCT/CN2022/076545 patent/WO2022199284A1/zh unknown
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103839007A (zh) * | 2014-03-03 | 2014-06-04 | 珠海市君天电子科技有限公司 | 一种检测异常线程的方法及系统 |
CN108984328A (zh) * | 2017-05-31 | 2018-12-11 | 中兴通讯股份有限公司 | 一种堆栈回溯的方法及装置 |
CN109901915A (zh) * | 2019-01-18 | 2019-06-18 | 江苏艾佳家居用品有限公司 | 一种分布式服务框架中的全链路堆栈信息跟踪方法 |
CN110502357A (zh) * | 2019-07-09 | 2019-11-26 | 北京字节跳动网络技术有限公司 | 一种栈回溯方法、装置、介质和设备 |
Also Published As
Publication number | Publication date |
---|---|
CN112925718A (zh) | 2021-06-08 |
WO2022199284A1 (zh) | 2022-09-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112925718B (zh) | 调用栈回溯方法、装置、设备和介质 | |
CN112925717B (zh) | 用于确定调用栈栈帧的对象的方法、装置、设备和介质 | |
WO2018077085A1 (zh) | 应用程序处理方法、装置及存储介质 | |
CN108228293B (zh) | 一种界面皮肤切换方法及装置 | |
CN110515871B (zh) | 一种中断方法、装置及fpga和存储介质 | |
CN112181554B (zh) | 一种交互界面显示方法、设备、电子设备及存储介质 | |
CN109684573B (zh) | 目标图片显示方法及装置、存储介质、电子设备 | |
CN110795192B (zh) | 语言切换方法、装置及终端设备 | |
CN108776587B (zh) | 数据获取方法、装置、计算机设备以及存储介质 | |
CN107479868B (zh) | 一种界面加载方法、装置及设备 | |
CN110727429A (zh) | 一种前端页面的生成方法、装置及设备 | |
EP3327565A1 (en) | Method and equipment for running a file | |
CN114048415A (zh) | 表单生成方法及装置、电子设备和计算机可读存储介质 | |
CN111459376A (zh) | 产品引导方法、装置及设备 | |
CN112770114A (zh) | 图像数据的压缩方法、装置、计算机设备以及存储介质 | |
US20140325535A1 (en) | Method of switching desktop subjects of mobile terminal and its switching apparatus | |
CN111538667A (zh) | 一种页面测试的方法及装置 | |
CN111142990A (zh) | 一种微信小程序页面展示方法、装置、及存储介质 | |
CN111061414A (zh) | 皮肤更换方法、装置、电子设备及可读存储介质 | |
CN114356290A (zh) | 一种数据处理方法、装置及计算机可读存储介质 | |
CN115604331A (zh) | 一种数据的处理系统、方法以及装置 | |
CN115437551A (zh) | 数据克隆的方法、设备、存储介质及计算机程序产品 | |
CN113342553A (zh) | 一种数据的获取方法、装置、电子设备及存储介质 | |
CN109150993B (zh) | 一种获取网络请求切面的方法、终端装置及存储介质 | |
CN108182081B (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 |