CN117271297A - 函数处理方法、装置、设备及存储介质 - Google Patents

函数处理方法、装置、设备及存储介质 Download PDF

Info

Publication number
CN117271297A
CN117271297A CN202210671798.7A CN202210671798A CN117271297A CN 117271297 A CN117271297 A CN 117271297A CN 202210671798 A CN202210671798 A CN 202210671798A CN 117271297 A CN117271297 A CN 117271297A
Authority
CN
China
Prior art keywords
function
statement
condition
processed
byte code
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.)
Pending
Application number
CN202210671798.7A
Other languages
English (en)
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 Zitiao Network Technology Co Ltd
Original Assignee
Beijing Zitiao 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 Zitiao Network Technology Co Ltd filed Critical Beijing Zitiao Network Technology Co Ltd
Priority to CN202210671798.7A priority Critical patent/CN117271297A/zh
Publication of CN117271297A publication Critical patent/CN117271297A/zh
Pending legal-status Critical Current

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/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • G06F11/3409Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment
    • G06F11/3419Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment by assessing time
    • G06F11/3423Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment by assessing time where the assessed time is active or idle time

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本公开实施例公开了函数处理方法、装置、设备及存储介质。该方法包括:在待处理函数中查找满足预设过滤条件的目标前置条件语句,根据目标前置条件语句在待处理函数中的目标位置确定插桩起始位置,其中,插桩起始位置位于目标位置之后,从插桩起始位置开始对待处理函数进行插桩处理,其中,插桩处理过程中插入的桩函数用于记录待处理函数的执行时间信息。通过采用上述技术方案,在满足预设过滤条件的目标前置条件语句的目标位置之后开始对待处理函数进行插桩处理,可以避免在目标前置条件语句中的函数出口处插入桩函数,从而减少桩函数的插入数量,避免因插桩处理导致应用程序的安装包体积过大。

Description

函数处理方法、装置、设备及存储介质
技术领域
本公开实施例涉及计算机技术领域,尤其涉及函数处理方法、装置、设备及存储介质。
背景技术
随着计算机技术的快速发展,应用程序的功能越来越丰富,为用户的工作和生活带来诸多便利。用户在使用应用程序的过程中,应用程序的卡顿和耗时直接影响用户使用应用程序的体验,因此,卡顿和耗时情况也成为衡量应用程序性能的重要指标。
目前,常见的耗时检测方式是利用插桩技术对应用层函数全量插入桩(Stub)函数,插桩技术可以理解为在保证被测函数代码原有逻辑完整性的基础上,在函数代码中插入一些探针(桩函数),利用桩函数来统计函数耗时,进而检测应用程序的卡顿问题。然而,在进行插桩时,需要针对函数入口以及每个函数出口插入桩函数,会导致插入较多数量的桩函数,引起应用程序的安装包的体积增大。
发明内容
本公开实施例提供了函数处理方法、装置、存储介质及设备,可以优化现有的针对函数进行插桩处理的方案。
第一方面,本公开实施例提供了一种函数处理方法,包括:
在待处理函数中查找满足预设过滤条件的目标前置条件语句;
根据所述目标前置条件语句在所述待处理函数中的目标位置确定插桩起始位置,其中,所述插桩起始位置位于所述目标位置之后;
从所述插桩起始位置开始对所述待处理函数进行插桩处理,其中,所述插桩处理过程中插入的桩函数用于记录所述待处理函数的执行时间信息。
第二方面,本公开实施例提供了一种函数处理装置,包括:
语句查找模块,用于在待处理函数中查找满足预设过滤条件的目标前置条件语句;
位置确定模块,用于根据所述目标前置条件语句在所述待处理函数中的目标位置确定插桩起始位置,其中,所述插桩起始位置位于所述目标位置之后;
插桩处理模块,用于从所述插桩起始位置开始对所述待处理函数进行插桩处理,其中,所述插桩处理过程中插入的桩函数用于记录所述待处理函数的执行时间信息。
第三方面,本公开实施例提供了一种函数处理设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如本公开实施例提供的函数处理方法。
第四方面,本公开实施例提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本公开实施例提供的函数处理方法。
本公开实施例中提供的函数处理方案,在待处理函数中查找满足预设过滤条件的目标前置条件语句,根据目标前置条件语句在待处理函数中的目标位置确定插桩起始位置,其中,插桩起始位置位于目标位置之后,从插桩起始位置开始对待处理函数进行插桩处理,其中,插桩处理过程中插入的桩函数用于记录待处理函数的执行时间信息。通过采用上述技术方案,在满足预设过滤条件的目标前置条件语句的目标位置之后开始对待处理函数进行插桩处理,可以避免在目标前置条件语句中的函数出口处插入桩函数,从而减少桩函数的插入数量,避免因插桩处理导致应用程序的安装包体积过大。
附图说明
图1为本公开实施例提供的一种函数处理方法的流程示意图;
图2为本公开实施例提供的另一种函数处理方法的流程示意图;
图3为本公开实施例提供的一种目标前置条件语句查找过程示意图;
图4为本公开实施例提供的一种插桩处理过程示意图;
图5为本公开实施例提供的一种函数处理装置的结构框图;
图6为本公开实施例提供的一种函数处理设备的结构框图。
具体实施方式
下面将参照附图更详细地描述本公开的实施例。虽然附图中显示了本公开的某些实施例,然而应当理解的是,本公开可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本公开。应当理解的是,本公开的附图及实施例仅用于示例性作用,并非用于限制本公开的保护范围。
应当理解,本公开的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本公开的范围在此方面不受限制。
本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。
需要注意,本公开中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
需要注意,本公开中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
本公开实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。
下述各实施例中,每个实施例中同时提供了可选特征和示例,实施例中记载的各个特征可进行组合,形成多个可选方案,不应将每个编号的实施例仅视为一个技术方案。
图1为本公开实施例提供的一种函数处理方法的流程示意图,该方法可以由函数处理装置执行,其中该装置可由软件和/或硬件实现,一般可集成在函数处理设备中,可以适用于通过插桩方式检测函数的耗时情况的应用场景。所述函数处理设备可以为服务器或个人电脑等计算机设备。如图1所示,该方法包括:
步骤101、在待处理函数中查找满足预设过滤条件的目标前置条件语句。
示例性的,为了检测应用程序的耗时情况,可以利用插桩技术对应用程序中的函数进行插桩,在插桩时,一般需要插入一个入口桩函数和至少一个出口桩函数,在被插桩函数的执行过程中,当入口桩函数被执行时,可以记录被插桩函数的起始执行时间戳,当出口桩函数被执行时,可以记录被插桩函数的结束执行时间戳,根据结束执行时间戳和起始执行时间戳的差值来确定被插桩函数的执行耗时。一般的,函数中可以包含多个函数出口,相关技术中,在进行插桩时,需要针对每个函数出口均插入出口桩函数,会导致插入较多数量的桩函数,引起应用程序的安装包的体积增大。
示例性的,代码开发人员在编码一个函数的实现时,经常会在函数起始处设计一些条件判断语句,如果条件不满足,则函数直接结束(也即条件判断语句中存在函数出口),而有些条件判断的执行耗时非常少,几乎可以忽略不计。
示例性的,下面以一个简单的条件判断语句为例:
if(a>0){
return;
}
上述条件判断语句在执行时判断a的数值是否大于0,如果大于0,则函数直接结束,执行耗时非常少,对于函数执行耗时的检测意义很小。
本发明实施例中,待处理函数可以理解为应用程序中需要插入桩函数的函数,待处理函数一般为应用层函数,可以以源代码片段或字节码片段(又称字节码区块)的形式存在。示例性的,可以将位于待处理函数的函数声明语句之后的起始部分的条件判断语句称为前置条件语句,若在某个条件判断语句之前存在预设耗时语句,则该条件语句不会被视为前置条件语句,也即,前置条件语句之前不包含函数声明语句和预设耗时语句。利用预设过滤条件来找到耗时较少的目标前置条件语句,避免在目标前置条件语句中的函数出口处插入出口桩函数,减少出口桩函数的插入数量。
其中,可以预先针对耗时较少的前置条件语句的特点制定相应的预设过滤条件,不同类型的前置条件语句可以对应不同的预设过滤条件,具体内容不做限定。示例性的,应用程序的源代码一般会编译为字节码,前置条件语句对应的字节码片段中通常包括多条字节码指令,其中,与字节码执行顺序相关的字节码指令以及耗时的字节码指令与前置条件语句的耗时情况相关,可以针对与字节码执行顺序相关的字节码指令以及耗时的字节码指令来设定预设过滤条件。
示例性的,在待处理函数中查找满足预设过滤条件的目标前置条件语句的过程中,可以按照从前至后的顺序依次获取各前置条件语句,依次判断当前前置条件语句是否满足预设过滤条件,根据判断结果确定是否继续查找,可以查找出一个目标前置条件语句,也可以查找出连续多个目标前置条件语句,也可以查找出全部的目标前置条件语句,可以实际需求设置。
步骤102、根据所述目标前置条件语句在所述待处理函数中的目标位置确定插桩起始位置,其中,所述插桩起始位置位于所述目标位置之后。
示例性的,若仅查找到一个目标前置条件语句,可将该目标前置条件语句在待处理函数中的结束位置确定为目标位置;若查找到多个目标前置条件语句,可将最后一个目标前置条件语句在待处理函数中的结束位置确定为目标位置。其中,结束位置可以理解为目标前置条件语句中的函数出口所在位置。示例性的,插桩起始位置位于目标位置之后,且与目标位置相邻,也可以理解为插桩起始位置位于目标位置和目标位置的下一条语句(或下一个字节码指令)之间。
可选的,若未找到目标前置条件语句,则插桩起始位置为待处理函数的函数入口所在位置,其中函数入口例如可以是函数声明语句之后与函数声明语句相邻的位置。
步骤103、从所述插桩起始位置开始对所述待处理函数进行插桩处理,其中,所述插桩处理过程中插入的桩函数用于记录所述待处理函数的执行时间信息。
示例性的,在根据目标位置确定了插桩起始位置之后,可以从插桩起始位置开始针对待处理函数进行插桩处理,位于插桩起始位置之前的函数出口不会被插入桩函数,从而减少插桩数目。插桩处理过程中插入的桩函数用于记录待处理函数的执行时间信息,经过插桩处理后的待处理函数可记为目标函数,其中,执行时间信息可以包括目标函数被执行过程中,桩函数被执行时的时间戳。
本公开实施例中提供的函数处理方案,在待处理函数中查找满足预设过滤条件的目标前置条件语句,根据目标前置条件语句在待处理函数中的目标位置确定插桩起始位置,其中,插桩起始位置位于目标位置之后,从插桩起始位置开始对待处理函数进行插桩处理,其中,插桩处理过程中插入的桩函数用于记录待处理函数的执行时间信息。通过采用上述技术方案,在满足预设过滤条件的目标前置条件语句的目标位置之后开始对待处理函数进行插桩处理,可以避免在目标前置条件语句中的函数出口处插入桩函数,从而减少桩函数的插入数量,避免因插桩处理导致应用程序的安装包体积过大。
在一些实施例中,所述从所述插桩起始位置开始对所述待处理函数进行插桩处理,包括:在所述待处理函数中的所述插桩起始位置插入入口桩函数;在所述待处理函数中的所述插桩起始位置之后的各函数出口分别插入出口桩函数。这样设置的好处在于,可以在减少桩函数的插入数量的基础上,对插桩起始位置之后的每个函数出口均插入出口桩函数,可以全面地检测待处理函数的耗时情况。
示例性的,入口桩函数可以表示为如Trace.begin(),出口桩函数可以表示为如Trace.end(),在目标函数执行过程中,当Trace.begin()被执行时,可以记录起始执行时间戳,当Trace.end()被执行时,可以记录结束执行时间戳,根据结束执行时间戳和起始执行时间戳的差值来确定目标函数的执行耗时。
在一些实施例中,所述预设过滤条件包括:前置条件语句对应的字节码片段中不包含预设耗时指令,且所述字节码片段中的字节码指令为第一类型字节码指令或第二类型字节码指令,其中,所述第一类型字节码指令为以预设函数出口指令作为函数出口的字节码指令,所述第二类字节码指令为经过预设函数跳转指令跳转至所述预设函数出口指令之后的字节码指令。这样设置的好处在于,可以准确地查找到耗时较少的前置条件语句。其中,所述字节码片段中的字节码指令为第一类型字节码指令或第二类型字节码指令,可理解为前置条件语句对应的字节码片段中只包括第一类型字节码指令和第二类型字节码指令。
其中,预设函数出口指令例如可包括RETURN、IRETURN、LRETURN、FRETURN、DRETURN、ARETURN以及ATHROW等;预设函数跳转指令例如可包括IFEQ、IFNE、IFLT、IFGE、IFGT、IFLE、IF_ICMPEQ、IF_ICMPNE、IF_ICMPLT、IF_ICMPGE、IF_ICMPGT、IF_ICMPLE、IF_ACMPEQ、IF_ACMPNE、IFNULL以及IFNONNULL等。
其中,预设耗时指令可以理解为可能引起待处理函数执行过程中耗时产生较多增加的指令。示例性的,预设耗时指令包括以下至少一项:锁相关指令、循环相关指令、输入输出相关指令、用户界面相关指令、本地函数调用指令以及进程间通信相关指令。
示例性的,以安卓为例,锁相关指令可包括如monitorenter、monitorexit以及ACC_SYNCHRONIZED等;循环相关指令,可包括goto指令,如果goto指令跳转至前面则表示存在循环;输入输出(Input Output,IO)相关指令,例如可包括文件操作、so加载、dex加载以及字体加载指令等;用户界面(User Interface,UI)相关指令,例如可包括视图(View)布局以及绘制等指令,还可包括动画相关指令;本地(Native)函数调用指令,可理解为对Native方法的调用指令;进程间通信(Inter-Process Communication,IPC)相关指令,例如可包括IPC接口调用指令。以安卓为例,预设耗时指令可包括如InvokeVirtual、InvokeSpecial、InvokeStatic、InvokeInterface以及InvokeDynamic等。
示例性的,若前置条件语句对应的字节码片段中包含预设耗时指令,则说明可能引起耗时有较多增加,不适合被滤除,因此,预设过滤条件包括:字节码片段中不包含预设耗时指令。另外,在将条件判断语句转换为字节码指令后,根据字节码指令的特点,可以确定满足如下规律时,所引起的耗时几乎可以忽略不计,该规律为:字节码片段中的字节码指令除了以预设函数出口指令作为函数出口之外,仅经过预设函数跳转指令跳转至预设函数出口指令之后的字节码指令。
在一些实施例中,所述在待处理函数中查找满足预设过滤条件的目标前置条件语句,包括:从所述待处理函数的函数入口开始,判断当前前置条件语句是否满足预设过滤条件,若满足,则将当前前置条件语句确定为目标前置条件语句,并将下一个前置条件语句确定为新的当前前置条件语句,继续判断当前前置条件语句是否满足所述预设过滤条件,直到当前前置条件语句不满足所述预设过滤条件或当前前置条件语句为最后一个前置条件语句。这样设置的好处在于,当查找到一个目标前置条件语句后,可以继续向后查找,从而可能找到连续多个目标前置条件语句,进而可以忽略更多的函数出口,进一步减少桩函数的插入数量。
在一些实施例中,所述根据所述目标前置条件语句在所述待处理函数中的目标位置确定插桩起始位置,包括:根据最后一个目标前置条件语句在所述待处理函数中的结束位置确定插桩起始位置。这样设置的好处在于,可以尽可能多的过滤掉不需要插入桩函数的函数出口,减少桩函数的插入数量。
可选的,可以预先扫描待处理函数对应的字节码指令,依据预设过滤条件确定连续存在的目标前置条件语句的目标数量,在需要进行插桩处理时,重新扫描待处理函数对应的字节码指令,并开始计数,每次扫描到预设函数出口指令时,认为找到一个目标前置条件语句,将计数加1,当计数的数值与目标数量相等时,将当前扫描到的预设函数出口指令所在位置确定为最后一个目标前置条件语句中的结束位置,也即确定插桩起始位置,并开始进行插桩处理。
图2为本公开实施例提供的另一种函数处理方法的流程示意图,本公开实施例以上述实施例中各个可选方案为基础进行优化,具体的,该方法包括如下步骤:
步骤201、确定待处理函数中的当前前置条件语句。
示例性的,从待处理函数的函数入口开始,按照从前至后的顺序依次确定当前前置条件语句。
步骤202、判断当前前置条件语句是否满足预设过滤条件,若是,则执行步骤203;否则,执行步骤205。
可选的,通过以下方式判断当前前置条件语句是否满足预设过滤条件:
确定当前字节码指令,其中,按照从前至后的顺序依次将当前前置条件语句中的字节码指令作为当前字节码指令。在当前字节码指令为预设耗时指令的情况下,确定当前前置条件语句不满足预设过滤条件。在当前字节码指令不为预设耗时指令的情况下,若确定当前字节码指令为所述预设函数跳转指令,则记录该预设函数跳转指令对应的跳转节点的节点标识;若确定当前字节码指令为已记录的节点标识对应的节点指令,则将对应的节点标识删除;若确定当前字节码指令为所述预设函数出口指令,则判断下一个字节码指令是否为已记录的节点标识对应的节点指令,若是,则将对应的节点标识删除,并判断当前是否存在已记录的节点标识,若不存在,则确定当前前置条件语句满足预设过滤条件。
图3为本公开实施例提供的一种目标前置条件语句查找过程示意图,可结合图3进行理解。
如图3所示,从待处理函数的函数入口开始,获取字节码指令,首次获取时,所获取的字节码指令一般为首个前置条件语句的第一个字节码指令。若当前获取的字节码指令为预设耗时指令,则当前前置条件语句不满足预设过滤条件,待处理函数目前没有可以忽略的函数出口,结束流程;若当前获取的字节码指令不是预设耗时指令,则可继续后面流程。
判断当前获取的字节码指令是否为预设跳转指令,若是,则记录该预设跳转指令对应的跳转节点的节点标识(LabelNode)(例如可在数据库中保存),也即记录当前字节码指令中所要跳转到的节点的节点标识,若否,则继续判断当前获取的字节码指令是否为已记录的节点标识对应的节点指令。例如,该预设跳转指令为“IFNONNULL L8”,可将L8作为跳转节点的节点标识进行记录。
若当前获取的字节码指令是已记录的节点标识对应的节点指令,则删除该节点指令对应的节点标识,否则,继续判断当前获取的字节码指令是否为预设函数出口指令。例如,假设当前字节码指令为“L8”,是节点标识“L8”对应的节点指令,则删除该已记录的节点标识“L8”。
若当前获取的字节码指令为预设函数出口指令,则获取下一个字节码指令,并判断该获取的字节码指令是否为已记录的节点标识对应的节点指令;若当前获取的字节码指令不为预设函数出口指令,则返回获取下一个字节码指令,并继续判断当前获取的字节码指令是否为预设耗时指令。
若该获取的字节码指令为已记录的节点标识对应的节点指令,则删除该节点指令对应的节点标识,否则,认为当前字节码指令所属前置条件语句不满足预设过滤条件,结束流程。
在删除该节点指令对应的节点标识之后,继续判断节点标识数据库是否为空,也即判断当前是否存在已记录的节点标识,若为空(也即不存在已记录的节点标识),则认为当前字节码指令所属前置条件语句满足预设过滤条件,目标前置条件语句的计数可以加1,也即可以忽略的函数出口的数量加1,随后继续获取下一个字节码,进行下一个前置条件语句的判定。若不为空,则认为当前字节码指令所属前置条件语句不满足预设过滤条件,结束流程。
示例性的,在结束流程后,将目标前置条件语句的当前计数记为目标数目。
下面以某个待处理函数的部分字节码指令为例(部分内容以省略号代替)进行说明:
1 L6
2 LINENUMBER 21L6
3 FRAME SAME
4 ALOAD 0
5 GETFIELD…;
6 IFNONNULL L8
7 ALOAD 0
8 GETFIELD…;
9 IFNULL L9
10 L8
11 LINENUMBER 22L8
12 FRAME SAME
13 RETURN
14 L9
如上述举例所示,共列出了14个字节码指令,字节码指令从上往下执行,不包含预设耗时指令,且除了第9行的“IFNULL”跳转到第14行的“L9”(第二类型字节码指令)之外,剩下的字节码指令均会经过第13行的“RETURN”退出函数(第一类型字节码指令),可认为所属的前置条件语句满足预设过滤条件。
步骤203、将当前前置条件语句确定为目标前置条件语句。
步骤204判断当前前置条件语句是否为最后一个前置条件语句,若是,则执行205;否则,返回执行步骤201。
步骤205、根据最后一个目标前置条件语句在待处理函数中的结束位置确定插桩起始位置。
示例性的,若首个当前前置条件语句不满足预设过滤条件,可认为目标前置条件语句的数量为0,则插桩起始位置为函数入口。
步骤206、在待处理函数中的插桩起始位置插入入口桩函数。
步骤207、在待处理函数中的插桩起始位置之后的各函数出口分别插入出口桩函数,得到目标函数。
图4为本公开实施例提供的一种插桩处理过程示意图,如图4所示,从函数入口开始逐个读取字节码指令,在读取到函数出口指令时,将出口指令数目加1,直到出口指令数目与目标数目相等时,可认为已经读取至最后一个目标前置条件语句中的函数出口指令,此时,根据该函数出口指令确定插桩起始位置,插入开始桩函数,并继续读取后面的字节码指令,每读取到一个函数出口指令,则插入一个出口桩函数,直到待处理函数的最后一个字节码指令(函数结束),则插桩处理过程结束,此时得到目标函数。在目标函数的执行过程中,可以利用插入的桩函数来记录执行时间信息,进而统计目标函数的耗时情况。
本公开实施例提供的函数处理方法,在待处理函数中查找满足预设过滤条件的连续的目标前置条件语句,根据最后一个目标前置条件语句在待处理函数中的结束位置确定插桩起始位置,在插桩起始位置插入入口桩函数,在插桩起始位置之后的各函数出口分别插入出口桩函数,得到目标函数。通过采用上述技术方案,在采用插桩方式检测应用程序中函数的耗时情况时,可以有效减少桩函数的插入数量,避免因插桩处理导致应用程序的安装包体积过大。
下面结合简单示例对上述技术效果进行说明,假设待处理函数包含3个满足预设过滤条件的目标前置条件语句,相关技术中,在进行插桩处理时,需要插入1个开始桩函数和4个结束桩函数,而采用本公开实施例提供的函数处理方法进行插桩处理后,插入1个开始桩函数和1个结束桩函数即可,有效减少了插桩数量。
图5为本公开实施例提供的一种函数处理装置的结构框图,该装置可由软件和/或硬件实现,一般可集成在函数处理设备中,可通过执行函数处理方法来进行函数处理。如图5所示,该装置包括:
语句查找模块501,用于在待处理函数中查找满足预设过滤条件的目标前置条件语句;
位置确定模块502,用于根据所述目标前置条件语句在所述待处理函数中的目标位置确定插桩起始位置,其中,所述插桩起始位置位于所述目标位置之后;
插桩处理模块503,用于从所述插桩起始位置开始对所述待处理函数进行插桩处理,其中,所述插桩处理过程中插入的桩函数用于记录所述待处理函数的执行时间信息。
本公开实施例中提供的函数处理装置,在待处理函数中查找满足预设过滤条件的目标前置条件语句,根据目标前置条件语句在待处理函数中的目标位置确定插桩起始位置,其中,插桩起始位置位于目标位置之后,从插桩起始位置开始对待处理函数进行插桩处理,其中,插桩处理过程中插入的桩函数用于记录待处理函数的执行时间信息。通过采用上述技术方案,在满足预设过滤条件的目标前置条件语句在待处理函数中的目标位置之后开始对待处理函数进行插桩处理,可以避免在目标前置条件语句中的函数出口处插入桩函数,从而减少桩函数的插入数量,避免因插桩处理导致应用程序的安装包体积过大。
可选的,插桩处理模块包括:
第一插入单元,用于在所述待处理函数中的所述插桩起始位置插入入口桩函数;
第二插入单元,用于在所述待处理函数中的所述插桩起始位置之后的各函数出口分别插入出口桩函数。
可选的,所述预设过滤条件包括:前置条件语句对应的字节码片段中不包含预设耗时指令,且所述字节码片段中的字节码指令为第一类型字节码指令或第二类型字节码指令,其中,所述第一类型字节码指令为以预设函数出口指令作为函数出口的字节码指令,所述第二类字节码指令为经过预设函数跳转指令跳转至所述预设函数出口指令之后的字节码指令。
可选的,所述语句查找模块用于:
从所述待处理函数的函数入口开始,判断当前前置条件语句是否满足预设过滤条件,若满足,则将当前前置条件语句确定为目标前置条件语句,并将下一个前置条件语句确定为新的当前前置条件语句,继续判断当前前置条件语句是否满足所述预设过滤条件,直到当前前置条件语句不满足所述预设过滤条件或当前前置条件语句为最后一个前置条件语句。
可选的,所述位置确定模块用于:根据最后一个目标前置条件语句在所述待处理函数中的结束位置确定插桩起始位置。
可选的,通过以下方式判断当前前置条件语句是否满足预设过滤条件:
确定当前字节码指令,其中,按照从前至后的顺序依次将当前前置条件语句中的字节码指令作为当前字节码指令;
在当前字节码指令为预设耗时指令的情况下,确定当前前置条件语句不满足预设过滤条件;
在当前字节码指令不为预设耗时指令的情况下,若确定当前字节码指令为所述预设函数跳转指令,则记录该预设函数跳转指令对应的跳转节点的节点标识;若确定当前字节码指令为已记录的节点标识对应的节点指令,则将对应的节点标识删除;若确定当前字节码指令为所述预设函数出口指令,则判断下一个字节码指令是否为已记录的节点标识对应的节点指令,若是,则将对应的节点标识删除,并判断当前是否存在已记录的节点标识,若不存在,则确定当前前置条件语句满足预设过滤条件。
可选的,所述预设耗时指令包括以下至少一项:
锁相关指令、循环相关指令、输入输出相关指令、用户界面相关指令、本地函数调用指令以及进程间通信相关指令。
下面参考图6,其示出了适于用来实现本公开实施例的函数处理设备600的结构示意图。本公开实施例中的函数处理设备可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、PDA(个人数字助理)、PAD(平板电脑)、PMP(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字TV、台式计算机等等的固定终端。图6示出的函数处理设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图6所示,函数处理设备600可以包括处理装置(例如中央处理器、图形处理器等)601,其可以根据存储在只读存储器(ROM)602中的程序或者从存储装置608加载到随机访问存储器(RAM)603中的程序而执行各种适当的动作和处理。在RAM 603中,还存储有函数处理设备600操作所需的各种程序和数据。处理装置601、ROM 602以及RAM 603通过总线604彼此相连。输入/输出(I/O)接口605也连接至总线604。
通常,以下装置可以连接至I/O接口605:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置606;包括例如液晶显示器(LCD)、扬声器、振动器等的输出装置607;包括例如磁带、硬盘等的存储装置608;以及通信装置609。通信装置609可以允许函数处理设备600与其他设备进行无线或有线通信以交换数据。虽然图6示出了具有各种装置的函数处理设备600,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。
特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在非暂态计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信装置609从网络上被下载和安装,或者从存储装置608被安装,或者从ROM 602被安装。在该计算机程序被处理装置601执行时,执行本公开实施例的方法中限定的上述功能。
需要说明的是,本公开上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、RF(射频)等等,或者上述的任意合适的组合。
上述计算机可读介质可以是上述函数处理设备中所包含的;也可以是单独存在,而未装配入该函数处理设备中。
上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该函数处理设备执行时,使得该函数处理设备:在待处理函数中查找满足预设过滤条件的目标前置条件语句;根据所述目标前置条件语句在所述待处理函数中的目标位置确定插桩起始位置,其中,所述插桩起始位置位于所述目标位置之后;从所述插桩起始位置开始对所述待处理函数进行插桩处理,其中,所述插桩处理过程中插入的桩函数用于记录所述待处理函数的执行时间信息。
可以以一种或多种程序设计语言或其组合来编写用于执行本公开的操作的计算机程序代码,上述程序设计语言包括但不限于面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本公开实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。其中,模块的名称在某种情况下并不构成对该模块本身的限定,例如,语句查找模块还可以被描述为“在待处理函数中查找满足预设过滤条件的目标前置条件语句的模块”。
本文中以上描述的功能可以至少部分地由一个或多个硬件逻辑部件来执行。例如,非限制性地,可以使用的示范类型的硬件逻辑部件包括:现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上系统(SOC)、复杂可编程逻辑设备(CPLD)等等。
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
根据本公开的一个或多个实施例,提供了一种函数处理方法,包括:
在待处理函数中查找满足预设过滤条件的目标前置条件语句;
根据所述目标前置条件语句在所述待处理函数中的目标位置确定插桩起始位置,其中,所述插桩起始位置位于所述目标位置之后;
从所述插桩起始位置开始对所述待处理函数进行插桩处理,其中,所述插桩处理过程中插入的桩函数用于记录所述待处理函数的执行时间信息。
根据本公开的一个或多个实施例,所述从所述插桩起始位置开始对所述待处理函数进行插桩处理,包括:
在所述待处理函数中的所述插桩起始位置插入入口桩函数;
在所述待处理函数中的所述插桩起始位置之后的各函数出口分别插入出口桩函数。
根据本公开的一个或多个实施例,所述预设过滤条件包括:前置条件语句对应的字节码片段中不包含预设耗时指令,且所述字节码片段中的字节码指令为第一类型字节码指令或第二类型字节码指令,其中,所述第一类型字节码指令为以预设函数出口指令作为函数出口的字节码指令,所述第二类字节码指令为经过预设函数跳转指令跳转至所述预设函数出口指令之后的字节码指令。
根据本公开的一个或多个实施例,所述在待处理函数中查找满足预设过滤条件的目标前置条件语句,包括:
从所述待处理函数的函数入口开始,判断当前前置条件语句是否满足预设过滤条件,若满足,则将当前前置条件语句确定为目标前置条件语句,并将下一个前置条件语句确定为新的当前前置条件语句,继续判断当前前置条件语句是否满足所述预设过滤条件,直到当前前置条件语句不满足所述预设过滤条件或当前前置条件语句为最后一个前置条件语句。
根据本公开的一个或多个实施例,所述根据所述目标前置条件语句在所述待处理函数中的目标位置确定插桩起始位置,包括:
根据最后一个目标前置条件语句在所述待处理函数中的结束位置确定插桩起始位置。
根据本公开的一个或多个实施例,通过以下方式判断当前前置条件语句是否满足预设过滤条件:
确定当前字节码指令,其中,按照从前至后的顺序依次将当前前置条件语句中的字节码指令作为当前字节码指令;
在当前字节码指令为预设耗时指令的情况下,确定当前前置条件语句不满足所述预设过滤条件;
在当前字节码指令不为预设耗时指令的情况下,若确定当前字节码指令为所述预设函数跳转指令,则记录该预设函数跳转指令对应的跳转节点的节点标识;若确定当前字节码指令为已记录的节点标识对应的节点指令,则将对应的节点标识删除;若确定当前字节码指令为所述预设函数出口指令,则判断下一个字节码指令是否为已记录的节点标识对应的节点指令,若是,则将对应的节点标识删除,并判断当前是否存在已记录的节点标识,若不存在,则确定当前前置条件语句满足所述预设过滤条件。
根据本公开的一个或多个实施例,所述预设耗时指令包括以下至少一项:
锁相关指令、循环相关指令、输入输出相关指令、用户界面相关指令、本地函数调用指令以及进程间通信相关指令。
根据本公开的一个或多个实施例,提供了一种函数处理装置,包括:
语句查找模块,用于在待处理函数中查找满足预设过滤条件的目标前置条件语句;
位置确定模块,用于根据所述目标前置条件语句在所述待处理函数中的目标位置确定插桩起始位置,其中,所述插桩起始位置位于所述目标位置之后;
插桩处理模块,用于从所述插桩起始位置开始对所述待处理函数进行插桩处理,其中,所述插桩处理过程中插入的桩函数用于记录所述待处理函数的执行时间信息。
以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的公开范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述公开构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
此外,虽然采用特定次序描绘了各操作,但是这不应当理解为要求这些操作以所示出的特定次序或以顺序次序执行来执行。在一定环境下,多任务和并行处理可能是有利的。同样地,虽然在上面论述中包含了若干具体实现细节,但是这些不应当被解释为对本公开的范围的限制。在单独的实施例的上下文中描述的某些特征还可以组合地实现在单个实施例中。相反地,在单个实施例的上下文中描述的各种特征也可以单独地或以任何合适的子组合的方式实现在多个实施例中。
尽管已经采用特定于结构特征和/或方法逻辑动作的语言描述了本主题,但是应当理解所附权利要求书中所限定的主题未必局限于上面描述的特定特征或动作。相反,上面所描述的特定特征和动作仅仅是实现权利要求书的示例形式。

Claims (10)

1.一种函数处理方法,其特征在于,包括:
在待处理函数中查找满足预设过滤条件的目标前置条件语句;
根据所述目标前置条件语句在所述待处理函数中的目标位置确定插桩起始位置,其中,所述插桩起始位置位于所述目标位置之后;
从所述插桩起始位置开始对所述待处理函数进行插桩处理,其中,所述插桩处理过程中插入的桩函数用于记录所述待处理函数的执行时间信息。
2.根据权利要求1所述的方法,其特征在于,所述从所述插桩起始位置开始对所述待处理函数进行插桩处理,包括:
在所述待处理函数中的所述插桩起始位置插入入口桩函数;
在所述待处理函数中的所述插桩起始位置之后的各函数出口分别插入出口桩函数。
3.根据权利要求1所述的方法,其特征在于,所述预设过滤条件包括:前置条件语句对应的字节码片段中不包含预设耗时指令,且所述字节码片段中的字节码指令为第一类型字节码指令或第二类型字节码指令,其中,所述第一类型字节码指令为以预设函数出口指令作为函数出口的字节码指令,所述第二类字节码指令为经过预设函数跳转指令跳转至所述预设函数出口指令之后的字节码指令。
4.根据权利要求3所述的方法,其特征在于,所述在待处理函数中查找满足预设过滤条件的目标前置条件语句,包括:
从所述待处理函数的函数入口开始,判断当前前置条件语句是否满足预设过滤条件,若满足,则将当前前置条件语句确定为目标前置条件语句,并将下一个前置条件语句确定为新的当前前置条件语句,继续判断当前前置条件语句是否满足所述预设过滤条件,直到当前前置条件语句不满足所述预设过滤条件或当前前置条件语句为最后一个前置条件语句。
5.根据权利要求4所述的方法,其特征在于,所述根据所述目标前置条件语句在所述待处理函数中的目标位置确定插桩起始位置,包括:
根据最后一个目标前置条件语句在所述待处理函数中的结束位置确定插桩起始位置。
6.根据权利要求3所述的方法,其特征在于,通过以下方式判断当前前置条件语句是否满足预设过滤条件:
确定当前字节码指令,其中,按照从前至后的顺序依次将当前前置条件语句中的字节码指令作为当前字节码指令;
在当前字节码指令为预设耗时指令的情况下,确定当前前置条件语句不满足所述预设过滤条件;
在当前字节码指令不为预设耗时指令的情况下,若确定当前字节码指令为所述预设函数跳转指令,则记录该预设函数跳转指令对应的跳转节点的节点标识;若确定当前字节码指令为已记录的节点标识对应的节点指令,则将对应的节点标识删除;若确定当前字节码指令为所述预设函数出口指令,则判断下一个字节码指令是否为已记录的节点标识对应的节点指令,若是,则将对应的节点标识删除,并判断当前是否存在已记录的节点标识,若不存在,则确定当前前置条件语句满足所述预设过滤条件。
7.根据权利要求3所述的方法,其特征在于,所述预设耗时指令包括以下至少一项:
锁相关指令、循环相关指令、输入输出相关指令、用户界面相关指令、本地函数调用指令以及进程间通信相关指令。
8.一种函数处理装置,其特征在于,包括:
语句查找模块,用于在待处理函数中查找满足预设过滤条件的目标前置条件语句;
位置确定模块,用于根据所述目标前置条件语句在所述待处理函数中的目标位置确定插桩起始位置,其中,所述插桩起始位置位于所述目标位置之后;
插桩处理模块,用于从所述插桩起始位置开始对所述待处理函数进行插桩处理,其中,所述插桩处理过程中插入的桩函数用于记录所述待处理函数的执行时间信息。
9.一种函数处理设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1-7任一项所述的方法。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-7任一项所述的方法。
CN202210671798.7A 2022-06-14 2022-06-14 函数处理方法、装置、设备及存储介质 Pending CN117271297A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210671798.7A CN117271297A (zh) 2022-06-14 2022-06-14 函数处理方法、装置、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210671798.7A CN117271297A (zh) 2022-06-14 2022-06-14 函数处理方法、装置、设备及存储介质

Publications (1)

Publication Number Publication Date
CN117271297A true CN117271297A (zh) 2023-12-22

Family

ID=89218321

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210671798.7A Pending CN117271297A (zh) 2022-06-14 2022-06-14 函数处理方法、装置、设备及存储介质

Country Status (1)

Country Link
CN (1) CN117271297A (zh)

Similar Documents

Publication Publication Date Title
CN110489345B (zh) 一种崩溃聚合方法、装置、介质和设备
CN110502357B (zh) 一种栈回溯方法、装置、介质和设备
CN111611145B (zh) 崩溃信息收集方法、装置、存储介质及电子设备
CN111190825A (zh) 自动测试方法、系统及机器人
CN110781658B (zh) 简历解析方法、装置、电子设备和存储介质
CN111813465B (zh) 一种信息获取方法、装置、介质和设备
CN110659210A (zh) 一种信息获取方法、装置、电子设备及存储介质
CN112084024B (zh) 一种内存监控方法、装置、介质和电子设备
CN111414152B (zh) 业务逻辑的实现方法、系统、可读介质和电子设备
CN111124541B (zh) 一种配置文件的生成方法、装置、设备及介质
CN111045926B (zh) 一种应用程序卡顿的检测方法、装置、介质和电子设备
CN112527302B (zh) 错误检测的方法及装置、终端和存储介质
CN111666201A (zh) 回归测试方法、装置、介质及电子设备
CN112379967B (zh) 模拟器检测方法、装置、设备及介质
CN117271297A (zh) 函数处理方法、装置、设备及存储介质
CN111382017A (zh) 故障查询方法、装置,服务器及存储介质
CN112286808B (zh) 应用程序的测试方法、装置、电子设备及介质
CN110908860B (zh) 一种Java线程的获取方法、装置、介质和电子设备
CN116185805A (zh) 代码检测方法、装置、设备及存储介质
CN110764995B (zh) 一种检测文件访问异常的方法、装置、介质和电子设备
CN115248772A (zh) 软件中间件的接口测试方法和装置
CN113760631A (zh) 页面加载时长确定方法、装置、设备和存储介质
CN111813663B (zh) 一种指针类型识别方法、装置、介质和设备
CN112506592A (zh) 页面加载时长的确定方法、装置、设备和存储介质
CN112711400B (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