用于控制流分析的方法和装置的制作方法

文档序号:6445192阅读:112来源:国知局
专利名称:用于控制流分析的方法和装置的制作方法
技术领域
本发明涉及数据分析技术,更具体地说,涉及用于控制流分析的方法和设备。
背景技术
控制流分析(control flow analysis)是对计算机程序进行性能分析的一个重要环节。控制流分析的基础是计算机程序的各函数之间的调用关系。本领域技术人员可以理解,这里所说的函数,指的是能够独立完成一定功能的代码单元,在某些场合下也可以称为方法等。调用函数向被调用函数传递参数,被调用函数对所述参数进行计算,然后将计算结果返回给调用函数。通常将函数调用关系记录下来用函数调用树(Call Tree)来表示。在函数调用树中,父节点表示调用函数,子节点表示被调用函数。使用函数调用树来表示函数之间的调用关系有助于确定被频繁调用的函数以及CPU时间开销过高的函数,从而确定程序的性能瓶颈,进而改进程序的性能。例如,对频繁被调用的函数,可以采用更加复杂的优化算法进行优化,或减少调用次数。如今的程序大多包含复杂的业务逻辑,其对应的函数调用树本身非常庞大。例如,企业级的应用程序通常包含超过10万的调用和超过200的调用层级。由于这类应用程序非常复杂,在真正的业务逻辑之外还存在很多辅助软件模块的“噪声”调用。对庞大的函数调用树进行分析需要花费大量的时间和精力。此外,现代应用程序往往基于复杂的框架(Framework),而应用的业务逻辑往往被封装在框架内部,难以对这些被封装的业务逻辑和框架进行分离,从而进行更准确的分析。因此,需要一种方法来对函数调用树进行简化,从而使得函数调用树能够更好地用于控制流分析,发现可能的性能瓶颈。

发明内容
本发明实施例提供了用于控制流分析的方法和装置。根据本发明实施例的用于控制流分析的方法包括:获取程序的原始函数调用树,其中所述原始函数调用树的节点表示函数,节点之间的父子关系表示调用关系;根据所述调用关系生成对应的函数支配树,其中函数支配树的节点表示函数,节点之间的父子关系表示支配关系,其中如果对第二函数的调用都由第一函数发起,则第一函数支配第二函数;根据所述函数支配树对所述原始函数调用树进行简化从而得到简化函数调用树。根据本发明实施例的用于控制流分析的设备包括:获取装置,配置为获取程序的原始函数调用树,其中所述原始函数调用树的节点表示函数,节点之间的父子关系表示调用关系;生成装置,配置为根据所述调用关系生成对应的函数支配树,其中函数支配树的节点表示函数,节点之间的父子关系表示支配关系,其中如果对第二函数的调用都由第一函数发起,则第一函数支配第二函数;简化装置,配置为根据所述函数支配树对所述原始函数调用树进行简化从而得到简化函数调用树。根据本发明实施例,可以简化用于控制流分析的调用树。


图1是适于用来实现本发明实施方式的示例性计算系统100的框图。图2是根据本发明实施例的用于控制流分析的方法的流程图。图3(a)到图3(d)是根据本发明实施例的用于控制流分析的方法的处理示意图。图4是根据本发明实施例的用于控制流分析的装置的框图。
具体实施例方式所属技术领域的技术人员知道,本发明的多个方面可以体现为系统、方法或计算机程序产品。因此,本发明的多个方面可以具体实现为以下形式,即,可以是完全的硬件、完全的软件(包括固件、驻留软件、微代码等)、或者本文一般称为“电路”、“模块”或“系统”的软件部分与硬件部分的组合。此外,本发明的多个方面还可以采取体现在一个或多个计算机可读介质中的计算机程序产品的形式,该计算机可读介质中包含计算机可用的程序码。可以使用一个或多个计算机可读的介质的任何组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是一但不限于——电的、磁的、光的、电磁的、红外线的、或半导体的系统、装置、器件或任何以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括以下:有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPR0M或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任何合适的组合。在本文件的语境中,计算机可读存储介质可以是任何包含或存储程序的有形的介质,该程序被指令执行系统、装置或者器件使用或者与其结合使用。计算机可读的信号介质可包括在基带中或者作为载波一部分传播的、其中体现计算机可读的程序码的传播的数据信号。这种传播的信号可以采用多种形式,包括——但不限于——电磁信号、光信号或任何以上合适的组合。计算机可读的信号介质可以是并非为计算机可读存储介质、但是能发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序的任何计算机可读介质。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于——无线、电线、光缆、RF等等,或者任何合适的上述组合。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括一但不限于——无线、电线、光缆、RF等等,或者任何合适的上述组合。用于执行本发明的操作的计算机程序码,可以以一种或多种程序设计语言的任何组合来编写,所述程序设计语言包括面向对象的程序设计语言-诸如Java、Smalltalk、C++之类,还包括常规的过程式程序设计语言-诸如“C”程序设计语言或类似的程序设计语言。程序码可以完全地在用户的计算上执行、部分地在用户的计算机上执行、作为一个独立的软件包执行、部分在用户的计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在后一种情形中,远程计算机可以通过任何种类的网络一包括局域网(LAN)或广域网(WAN)-连接到用户的计算机,或者,可以(例如利用因特网服务提供商来通过因特网)连接到外部计算机。
以下参照按照本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述本发明的多个方面。要明白的是,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得通过计算机或其它可编程数据处理装置执行的这些指令,产生实现流程图和/或框图中的方框中规定的功能/操作的装置。也可以把这些计算机程序指令存储在能指令计算机或其它可编程数据处理装置以特定方式工作的计算机可读介质中,这样,存储在计算机可读介质中的指令产生一个包括实现流程图和/或框图中的方框中规定的功能/操作的指令装置(instruction means)的制造品。也可以把计算机程序指令加载到计算机或其它可编程数据处理装置上,使得在计算机或其它可编程数据处理装置上执行一系列操作步骤,以产生计算机实现的过程,从而在计算机或其它可编程装置上执行的指令就提供实现流程图和/或框图中的方框中规定的功能/操作的过程。下面参照附图,结合具体实施例对本发明进行描述。这样的描述仅仅出于说明目的,而不意图对本发明的范围进行限制。图1示出了适于用来实现本发明实施方式的示例性计算系统100的框图。如所示,计算机系统100可以包括:CPU(中央处理单元)101、RAM(随机存取存储器)102、R0M(只读存储器)103、系统总线104、硬盘控制器105、键盘控制器106、串行接口控制器107、并行接口控制器108、显示控制器109、硬盘110、键盘111、串行外部设备112、并行外部设备113和显示器114。在这些设备中,与系统总线104耦合的有CPU 10URAM 102, ROM 103、硬盘控制器105、键盘控制器106、串行控制器107、并行控制器108和显示控制器109。硬盘110与硬盘控制器105耦合,键盘111与键盘控制器106耦合,串行外部设备112与串行接口控制器107耦合,并行外部设备113与并行接口控制器108耦合,以及显示器114与显示控制器109耦合。应当理解,图1所述的结构框图仅仅为了示例的目的而示出的,而不是对本发明范围的限制。在某些情况下,可以根据具体情况而增加或者减少某些设备。为了对调用树进行简化,可以考虑过滤的方法。显然,对调用树上的节点进行逐个分析以便确定是否该从调用树上去除该节点,这种方法是不现实的。比较现实的做法是由分析员(analyst)设定过滤标准,然后根据该过滤标准对调用树进行过滤。例如,为了将调用树中与Java软件开发工具包(SDK, Software Development Kit)的库函数的节点去除,可以将过滤标准设置为“将名称以字符‘java/’开始的节点去除”。又例如,可以将被调用次数小于一定阈值的节点从调用树中去除,即将过滤标准设置为“将被调用次数小于阈值的节点去除”。采用过滤的方法需要分析员对程序具有非常深刻的了解。过滤标准设置不当要么起不到对函数调用树进行简化的效果,要么会将关键节点从调用树上去除从而导致关键信息丢失。此外,将实际的过滤需求转换成可以执行的过滤标准也对分析员提出了很高的要求。例如,并非所有与Java软件开发工具包(SDK, Software Development Kit)的库函数节点的名称都以字符“java/”开始。下面参照图2描述根据本发明实施例的用于进行控制流分析的方法。在下面的描述中,函数和节点对应。
步骤201,获取程序的原始函数调用树,其中所述原始函数调用树的节点表示函数,原始函数调用树的节点之间的父子关系表示函数之间的调用关系。本领域技术人员可以通过很多手段获取程序的原始函数调用树,例如可以通过静态分析的方法从源代码或目标代码中获取原始函数调用树,也可以通过动态分析的方法在程序的执行过程中获取原始函数调用树。在动态分析方法中,在调用函数进行调用时需要进行入栈、跳转等操作,在被调用函数返回时需要进行出栈、跳转操作,从而能够识别出调用。—个示意性的原始函数调用树如图3(a)所示。在最下面的一条路径中,函数B调用函数C,函数C调用函数E,函数E调用函数G,函数G调用函数H。一个调用函数可能调用多个被调用函数,这些不同的调用在原始函数调用树上都被表示为不同的路径。例如函数A调用函数C,函数C调用函数D的情况,就与函数A调用函数C,函数C再调用函数E的情况是不同的两条路径。函数A和函数B不被其他任何函数调用。步骤202,将程序的原始函数调用树转换成函数调用有向图(Call Graph)。将树结构转换成有向图结构是本领域的常用技术手段,在此不再赘述。需要注意的是,在将原始函数调用树转换成函数调用有向图时,原始函数调用树的不同路径上的相同函数只对应函数调用有向图的一个节点,但是原始函数调用树上与所述函数有关的不同调用关系对应于函数调用有向图上的不同有向边。图3(b)是图3(a)的原始函数调用树所对应的函数调用有向图。在图3(a)中,函数C出现了 3次,对应于四个调用关系,分别是:
函数A调用函数C,函数C调用函数D ;函数A调用函数C,函数C调用函数E ;函数B调用函数C,函数C调用函数E。在图3(b)中,函数C只对应一个节点C,但是与节点C有关的有向边有四条。以下是根据本发明一个实施例的用于实现步骤202的伪代码:
PROCEDURE CALL—TREE—TO_CALL_GRAPH BEGIN
FOR each node as CALLER on call tree DO
FOR each child as CALLEE of CALLER DO
add {CALLER, CALLEE} as edge into call graph ENDFOR ENDFOR END步骤203,将函数调用有向图转换成函数支配树(Dominator Call Tree),其中函数支配树中的父子关系表示支配关系。在函数支配树中,父节点支配子节点。支配关系的定义是:
如果从程序入口开始,调用函数Y之前必然调用函数X,则函数X支配函数Y。换句话说,如果对函数Y的调用都由函数X发起,则函数X支配函数Y。这里的“发起”既可以指函数X直接调用函数Y,也可以指函数X调用第三函数而第三函数调用函数Y。如果函数X支配函数Y,并且函数X不支配支配函数Y的其他函数,则函数X直接支配函数Y。从图3(b)可以看出,函数A和函数B不被其他任何函数调用,所以函数A和函数B不被任何函数支配。如果要调用函数C,可以经过函数A,也可以经过函数B,因此函数A和函数B都不支配函数C,则函数C也不被任何函数支配。因此在函数支配树上,函数C处于和函数A和函数B相同的层级上。从图3 (b)还可以看出,如果要调用函数D、函数E、函数F、函数G、函数H,都必然经过函数C,因此函数C支配函数D、函数E、函数F、函数G、函数H,其中函数C直接支配函数D、函数E。关于函数H,可以通过函数C —函数D —函数F —函数H的路径来调用函数H,也可以通过函数C —函数E —函数G —函数H的路径来调用函数H。因此函数H被函数C支配,而不被函数D、函数E、函数F或函数G中的任何一个支配。关于函数D和函数F,由于调用函数F必须经过函数D,但是调用函数D不是必须经过函数F,因此函数D支配函数F但函数F不支配函数D。类似地,可以推导出其他函数之间的支配关系,从而得到图3(c)所示的函数支配树。从前面的描述可以看出,函数支配树依据的是函数之间的调用关系。调用关系的信息记载在原始函数调用树中。因此,可以省略步骤202而直接从图3(a)所示的原始函数调用树得到图3(c)所示的函数支配树。以下是根据本发明实施例的用于实现步骤203的伪代码:
权利要求
1.一种用于控制流分析的方法,该方法包括: 获取程序的原始函数调用树,其中所述原始函数调用树的节点表示函数,节点之间的父子关系表不调用关系; 根据所述调用关系生成对应的函数支配树,其中函数支配树的节点表示函数,节点之间的父子关系表示支配关系,其中如果对第二函数的调用都由第一函数发起,则第一函数支配第二函数; 根据所述函数支配树对所述原始函数调用树进行简化从而得到简化函数调用树。
2.如权利要求1所述的方法,其中根据所述调用关系生成对应的函数支配树包括: 将所述原始函数调用树转换成函数调用有向图;和 将函数调用有向图转换成函数支配树。
3.如权利要求1所述的方法,其中根据所述函数支配树对所述原始函数调用树进行简化从而得到简化函数调用树包括: 根据所述函数支配树,识别基本函数包的入口函数;和 从所述原始函数调用树中移除所述入口函数对应的节点的子节点,从而得到简化函数调用树。
4.如权利要求3所述的方法,其中根据所述函数支配树识别基本函数包的入口函数所对应的节点包括: 在所述函数支配树中识别强支配者函数,其中所述强支配者函数被多个其他函数调用,并且没有任何其他强支配者函数支配所述多个其他函数的全部; 将所述强支配者函数作为所述入口函数。
5.如权利要求1所述的方法,进一步包括: 根据过滤标准对所述简化函数调用树进行过滤。
6.一种用于控制流分析的设备,该设备包括: 获取装置,配置为获取程序的原始函数调用树,其中所述原始函数调用树的节点表示函数,节点之间的父子关系表示调用关系; 生成装置,配置为根据所述调用关系生成对应的函数支配树,其中函数支配树的节点表示函数,节点之间的父子关系表示支配关系,其中如果对第二函数的调用都由第一函数发起,则第一函数支配第二函数; 简化装置,配置为根据所述函数支配树对所述原始函数调用树进行简化从而得到简化函数调用树。
7.如权利要求6所述的设备,其中所述生成装置包括: 配置为将所述原始函数调用树转换成函数调用有向图的装置;和 配置为将函数调用有向图转换成函数支配树的装置。
8.如权利要求6所述的设备,其中所述简化装置包括: 配置为根据所述函数支配树,识别基本函数包的入口函数的装置;和配置为从所述原始函数调用树中移除所述入口函数对应的节点的子节点,从而得到简化函数调用树的装置。
9.如权利要求8所述的设备,其中根据所述函数支配树识别基本函数包的入口函数所对应的节点包括:配置为在所述函数支配树中识别强支配者函数的装置,其中所述强支配者函数被多个其他函数调用,并且没有任何其他强支配者函数支配所述多个其他函数的全部; 配置为将所述强支配者函数作为所述入口函数的装置。
10.如权利要求6所述的设备,进一步包括: 配置为根据过滤标准对 所述简化函数调用树进行过滤的装置。
全文摘要
根据本发明实施例的一种用于控制流分析的方法包括获取程序的原始函数调用树,其中所述原始函数调用树的节点表示函数,节点之间的父子关系表示调用关系;根据所述调用关系生成对应的函数支配树,其中函数支配树的节点表示函数,节点之间的父子关系表示支配关系,其中如果对第二函数的调用都由第一函数发起,则第一函数支配第二函数;根据所述函数支配树对所述原始函数调用树进行简化从而得到简化函数调用树。根据本发明实施例,可以简化用于控制流分析的函数调用树。
文档编号G06F9/45GK103186406SQ201110461369
公开日2013年7月3日 申请日期2011年12月30日 优先权日2011年12月30日
发明者刘峰, 梁祺, 陈沁悦, 林鸿昌 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1