增强软件的软件调用栈的可视化的方法、设备和系统的制作方法

文档序号:6584057阅读:133来源:国知局
专利名称:增强软件的软件调用栈的可视化的方法、设备和系统的制作方法
技术领域
本发明涉及软件行为的可视化技术,更具体而言,涉及一种用于增强软件的软件调用栈的可视化的方法、设备和系统。
背景技术
信息可视化(Visualization)技术是利用计算机图形学和图像处理技术,将数据转换成图形或图像在屏幕上显示出来,并进行交互处理的技术。通常,开发人员具有对于在图形用户界面(GUI)上可视化所需信息和工具的工具支持。在软件性能分析中分析软件调用栈是常用且非常有用的手段。这里“软件调用栈”是指对于软件执行过程中软件行为的记录。开发人员通常通过能够可视化软件调用栈的图形用户界面来浏览和分析软件调用栈。软件调用栈可视化的输入来自于系统中 !Profiling(采样)工具的输出。Profiling技术被开发用于提供程序实际执行时的相关信息。Profiling工具捕获在软件运行过程中的调用信息——诸如特定方法/函数是否被调用、调用特定方法/函数的次数、调用者和被调用者之间的关系、花费在执行特定方法/函数上的时间等——并且产生作为明文文本输出的数据文件,诸如文本文件或二进制文件。 Profiling工具能够帮助用户分析并发现软件程序运行的瓶颈,找到耗时所在,从而最终实现程序的优化。但是,Profiling工具的输出主要记录软件程序在代码级别的行为,例如, 有多少工作线程以及详细的数据流和控制流(诸如,调用信息)等等。现有技术中已经存在解析Profiling工具输出的软件调用栈的数据文件并还原软件调用栈以生成软件调用栈可视化的工具。“解析”用于基于软件调用栈的数据文件生成一组调用对象,这里软件调用栈中的一个“调用对象”指的是一个软件在其运行中执行的一个方法或函数。“还原”用于识别出代码级别的所有的调用对象之间的调用关系。图1示出了利用一个现有软件调用栈可视化工具获得的软件调用栈可视化的一部分的屏幕截图。但是,现有软件调用栈可视化工具具有如下缺陷1.在现有软件调用栈的可视化中对软件调用栈进行浏览和定位非常耗时软件调用栈的信息非常庞杂,数据量巨大。在软件调用栈中,从应用的开始点到特定调用,可能要深入数千级。如果到达的调用不是感兴趣的那个调用,则用户需要从另一分支重新开始并深入。这么一遍又一遍地重复,直到定位性能问题为止。这甚至可能使用户浏览数万至数十万级调用栈,甚至更多。2.软件的所有信息都被堆叠到代码级别中软件调用栈仅仅涉及到代码级别的软件行为。它不能呈现高层次的软件设计和软件架构信息,而这些信息在分析软件的性能时可能会有很大帮助。在本领域中通常以结构化的方式设计软件。软件架构师常常将软件设计成一组模块的组合。这些模块及模块之间的交互通常被定义为软件架构。有关这些模块及模块之间的交互的信息通常被定义为软件架构信息。软件架构在软件设计阶段完成,并且可以被相关人员获得。图2是示出一个现有软件的软件架构的示例性框图,其中一个方框代表一个模块,不同模块之间的重叠表示模块之间具有调用关系。通常可以在软件设计阶段中完成所有模块定义。例如,模块可以被定义为执行某一功能的代码单元。当软件运行时,软件的各个模块协作以作为一个整体完成功能或服务。 如果软件具有性能问题,则很可能是由于在某些模块中存在瓶颈。所以在多数情况下,性能分析关心的仅仅是一部分软件调用栈。该部分软件调用栈可以被映射到软件架构中的一个或多个模块。现有技术已经进行了如下尝试来解决在现有软件调用栈可视化工具中存在的上述问题1.使用基于关键词或表达式的搜索,其提供基于关键词搜索调用栈的功能2.通过预先定义的度量或阈值来分组和过滤,其提供基于正则表达式或阈值的过滤功能使用这种搜索技术的例子之一是IBM Visual PerformanceAnalyzer (VPA,可视性能分析器)(其详细描沭可以从网址http://w驟.alphaworks. ibm. com/tech/vpa处获得)。图3示出了使用IBM VPA可视化窗口提供的查询界面的屏幕截图。这些手段虽然有用,但是所起作用非常有限。这些手段仅仅涉及到软件调用栈本身,并且软件的所有信息仍然被堆叠在代码级别中。通过这些手段用户仍然不能在浏览和定位软件调用栈中应用其对于软件架构的了解。因此,需要一种能够增强软件的软件调用栈的可视化的方式,使得用户能够在可视化和分析软件调用栈的同时应用其对软件产品架构的了解来帮助搜索和定位感兴趣模块的执行信息。

发明内容
考虑到现有技术中存在的上述问题,本发明提供了一种用于增强软件调用栈的可视化的方法、设备和系统。根据本发明的所述软件调用栈的可视化结合有软件架构信息。根据本发明实现的软件调用栈的可视化能够帮助用户应用其对软件产品架构的了解,从而加速对软件调用栈的浏览并且帮助定位性能瓶颈。本发明可以以包括方法、设备或系统的多种方式实施。下面讨论本发明的几个实施例。作为一种用于增强软件的软件调用栈的可视化的方法,本发明的一个实施例至少包括下列操作获得用于描述所述软件的软件架构的软件架构信息;解析所述软件架构信息以生成一组模块对象,其中所述模块对象与所述软件的软件模块相对应;获得所述软件调用栈的调用对象,其中所述调用对象对应于所述软件的运行中执行的方法或函数;将所述模块对象的调用接口与所述调用对象进行比较;以及根据比较结果,将模块对象的对应信息关联到所述软件调用栈的调用对象。作为一种用于增强软件的软件调用栈的可视化的设备,本发明的一个实施例至少包括用于获得用于描述所述软件的软件架构的软件架构信息的装置;用于解析所述软件架构信息以生成一组模块对象的装置,其中所述模块对象与所述软件的软件模块相对应; 用于获得所述软件调用栈的调用对象的装置,其中所述调用对象对应于所述软件的运行中执行的方法或函数;用于将所述模块对象的调用接口与所述调用对象进行比较的装置;以及用于根据比较结果,将模块对象的对应信息关联到所述软件调用栈的调用对象的装置。作为一种用于增强软件的软件调用栈的可视化的系统,本发明的一个实施例至少包括上述设备。本发明的其中一个实施例至少提供了以下优点之一1.对于软件行为的新视点-检视设计层面上软件模块之间的调用关系;以及-检视分到软件的各个模块的CPU和存储资源的使用情况2.浏览调用栈的新方法(按照软件模块的类别浏览调用栈)3.定位调用栈的一部分的新方法(按照软件模块进行过滤)4.使得软件架构师、软件开发人员和性能分析师能够协作描述特定软件的架构。


图1示出了利用一个现有软件调用栈可视化工具获得的软件调用栈可视化的一部分的屏幕截图。图2是示出一个现有软件的软件架构的示例性框图。图3示出了使用IBM VPA可视化窗口提供的查询界面的屏幕截图。图4是示出了根据本发明的一个实施例的用于增强软件调用栈的可视化的方法的流程图。图5是示出了作为例子的一个软件的软件架构的示意性模块结构图。图6是示出了根据本发明的另一个实施例的优选的用于增强软件调用栈的可视化的方法的流程图。图7是示出了根据本发明的另一个实施例的优选的用于响应于用户输入进行增强软件调用栈的可视化的方法的流程图。图8是示出了根据本发明的一个实施例的用于增强软件调用栈的可视化的设备的示例性框图。图9示出了使用根据本发明的软件调用栈可视化窗口提供的查询界面的屏幕截图。图10示出了使用根据本发明的增强的软件调用栈可视化而获得的各个软件模块对系统资源的使用情况的直方图。图11示出了使用根据本发明的增强的软件调用栈可视化而获得的各个软件模块之间的调用关系的示意图。图12示出了根据本发明的一个实施例的使用描述文件的属性生成的示例性标签。
具体实施例方式现在将以具体的、示例性实施例描述本发明。应该理解,本发明不限于所披露的示例性实施例。还应该理解,目前所披露的增强软件调用栈的可视化的方法、设备和系统的每一个特征并非都是实现所附权利要求任一具体权项要求保护的发明必不可少的。描述设备的多个元件和特征是为了使本发明完全能够得以实施。还应该理解的是,在本说明书中,在表示或者描述处理或方法之处,方法的步骤可以按照任何顺序执行或者同时执行,除非从上下文中显然可以看出一个步骤依赖于先前执行的另一步骤。本发明提供了用于增强软件调用栈的可视化的方法、设备和系统。具体而言,根据本发明的一个实施例的技术方案获得用于描述所述软件的软件架构的软件架构信息;解析所述软件架构信息以生成一组模块对象,其中所述模块对象与所述软件的软件模块相对应;获得所述软件调用栈的调用对象,其中所述调用对象对应于所述软件的运行中执行的方法或函数;将所述模块对象的调用接口与所述调用对象进行比较;以及根据比较结果, 将模块对象的对应信息关联到所述软件调用栈的调用对象。在一个可替换实施例中,本发明也可以首先如现有技术中那样生成软件调用栈的可视化。然后根据用于请求填充的用户输入再如上述那样将软件架构信息关联到软件调用栈的可视化。在一个实施例中,本发明提供了一种对于软件架构进行格式化描述的格式。在另一个实施例中,软件调用栈的调用对象是通过解析软件调用栈的数据文件获得的。在另一个实施例中,软件调用栈的调用对象是从软件调用栈的可视化中获得的。在另一个实施例中,所述填充是通过把当前匹配的模块对象的属性写入到内存中的另一地址处并建立从匹配的调用对象指向该另一地址的链接、或将属性写入与调用对象相邻的地址,例如将属性写入与对应的调用对象的存储地址相邻的偶地址或奇地址、将属性作为对应的调用对象的参数之一、或者任何可以将模块对象的属性与对应的调用对象关联起来的方式来实现的。 在再一个实施例中,模块对象的属性包括模块名称、模块的调用接口、该模块的前驱模块 (即,调用该模块的另一模块)。在再一个实施例中,描述文件也具有属性,所述属性包括所述描述文件的版本、作者以及所描述的软件的版本、名称等。本发明通过提供上述属性可以建造描述文件库以存储和共享对不同软件架构的描述文件。图4是示出了根据本发明的一个实施例的用于增强软件调用栈的可视化的方法的流程图。根据本发明的处理过程开始于步骤401。然后过程前进到步骤403。在步骤403,获得用于描述一个软件的软件架构的软件架构信息。然后过程前进到步骤405。如上所述,软件架构在软件设计阶段就已经确定了,相关技术人员可以从软件设计中获得软件架构信息。但是,这些与本发明并不密切相关。在本发明的一个实施例中,所述软件架构信息采用使用预定格式结构化描述软件架构的描述文件的形式。在步骤405,解析所述软件架构信息以生成所述软件的一组模块对象。模块对象与软件模块相对应,通常为一一对应。然后过程前进到步骤407。以下示出了作为例子的一个模块对象。在这个示例性实现方式中,模块对象为通过解析软件架构信息而生成的存储在内存中的多组数据。在这种实现方式中,一个模块对象为一组数据,包括模块名称、该模块的前驱模块、以及该模块的调用接口。0x0001 WWW Security0x0003 Dogear Access0x0005 I: com/ibm/ws/security/web/FormLoginExtensionProcessor. handleRequest(ServletRequest,
ServletResponse)void在另一种实现方式中,软件架构信息被解析为多个软件程序中的类对象,每个类对象指向存储一组信息的首地址,例如,指向0x0001。当然,本领域技术人员还可以设想出其它的实现方式,只有能够找到各个软件模块的信息就可以,并且这些实现方式都在本发明的保护范围之内。在步骤407,获得软件调用栈的调用对象。然后过程前进到步骤409。以下示出了作为例子的软件调用栈的一个调用对象。如前所述,调用栈中的一个调用对象指的是一个软件在其运行中执行的一个方法或函数。void FormLoginExtensionProcessor. handleRequest (ServletRequest, ServletResponse)该方法是web应用容器(web container)中安全控制模块的一个接口调用方法。 该调用接口具有两个参数,即,ServletRequest和ServletResponse。程序调用该调用接口后,将进入到安全控制模块中,具体执行安全控制模块的功能,并将执行结果写入到参数 ServletResponse 中。在步骤409,将所述模块对象的调用接口与所述调用对象进行比较。然后过程前进到步骤411。在步骤411,根据比较结果,将模块对象的对应信息关联到软件调用栈的调用对象。然后过程前进到步骤413。在步骤413,过程结束。本发明提供了一种用于结构化地描述软件架构的格式,本发明提供该格式是基于如下假设软件的架构可以被图示为一组模块。根据本发明的用于描述软件架构的格式被定义为通用且平台无关的,这意味着该格式可以应用于不同类型的软件,即使该软件是使用不同技术以架构方式构造的。按照该格式,对软件架构的描述可以由不同人员——包括软件架构师、开发人员、和性能分析师——来定义和重用。根据本发明的格式被设计成包括软件的各个模块之间的关系,用于描述当各个模块一起协作时这些模块之间的调用关系。根据本发明的一个优选实施例,该格式仅描述一个模块被其它模块调用的关系,也就是说,仅描述直接调用该模块的前驱模块。这种格式与软件代码的执行顺序一致,便于用户实现。在另一实施例中,该格式能够描述一个模块对其它模块调用的关系,也就是说,仅描述该模块直接调用的后继模块。在再一个实施例中,该格式也可以包括冗余调用关系信息。也就是说,除了描述一个模块(作为被调用者)被其它模块调用的关系之外,该格式还描述该模块(作为调用者)对其它模块调用的关系。此外,根据本发明的格式还被设计成包括各个模块的特征。每个模块都具有某些特征,诸如模块名称、供调用的调用接口等等。对于一个模块,该格式通过模块名称和通过其可以调用模块的功能的调用接口来描述模块的特征。在本文中,将模块之间的调用关系、模块的特征等称为模块的属性。根据本发明的格式使用模块的各个属性来定义模块。对于可以表示为一组模块的软件架构,根据本发明的一个实施例的用于结构化描述软件架构的格式被表示如下所示Arch 一 ArchModules 一 ArchModule 一 Entries 一 Entry
该格式首先定义软件架构,然后定义包括在架构中的ー个或多个模块,再然后定 义ー个或多个模块中的每ー个模块,再然后定义每ー个模块包括的一个或多个调用接ロ, 最后定义ー个或多个调用接ロ中的每ー个调用接ロ。以下示出了使用XML语言编写的描述根据本发明的格式的文件。该文件如下定 义〈? xml version=" 1.0〃 encoding=" UTF—8" ? ><xs:schemaxmlns:xs = “ http://www. w3. org/2001/XMLSchema"elementFormDefault =" qualified" ><xs:element name=" Arch" ><xs: complexType><xs: sequence)<xs:element maxOccurs = " 1" minOccurs = /r 0" ref = " ModuleList/ruse=" required" /></xs: sequence)<xs:attribute name ニ" version“ type =” xs:string" use =" required" /><xs:attribute name = ” author“ type = ” xs:string" use = “ required" />〈xs:attribute name =" software" type ニ” xs:string" use =" required" /><xs:attribute name = " software-version"type = " xs: string"use=" required" /></xs: complexType></xs: element)<xs:element name = " ModuleList" ><xs: complexType><xs: sequence)<xs:elementmaxOccurs = “ unbounded"minOccurs = “ 1 “ref=" Module" /></xs: sequence)</xs: complexType></xs: element〉<xs:element name = " Module" ><xs: complexType><xs: sequence)<xs:element minOccurs =" 1" ref=" Entries'7 />く/xs: sequence)
</xs: complexType><xs:attribute name = " name" type = " xs: string" use = " required" /><xs:attribute name = " prev" type = " xs: string" use = " requried" /></xs: element〉<xs:element name = “ Entries" >

<xscomplexType> <xssequence)〈xs:elementmaxOccurs = 〃 unbounded" minOccurs = 〃 1〃 ref = 〃 Entry“ /></xs: sequence)</xs: complexType>〈/xs: element〉<xs: element name = “ Entry“ ><xs: complexType>〈xs:attribute name =” name“ type =” xs: string" use =” required" /></xs: complexType>〈/xs: element〉</xs: schema)在上述文件中,第1行是XML的声明语句开头,在之前不能有任何形式的字符,其中Version表示XML的版本号;encoding表示文档的编码方式,默认是“UTF-8”。第2 行声明“http://www. w3. org/2001/XMLSchema”是一个 XML 文件格式的描述。前两行是XML文件所需的声明性语句。第3-13行定义了元素“Arch”,其最少出现1次,引用Modulelist,具有以下4个属性版本、作者、软件、和软件版本,这些属性都用字符串表示。第14-20行定义了元素“Modulelist”,其最多出现未限定次,最少出现1次,引用 Module。第21- 行定义了元素“Module”,其最多出现未限定次,最少出现0次,引用 Entries,具有以下2个属性名称、和前一模块,这些属性都用字符串表示。第30-36行定义了元素“Entries”,其最多出现未限定次,最少出现1次,引用 Entry0第37-41行定义了元素“Entry”,其具有1个属性名称,该属性都用字符串表示。图5是示出了作为例子的一个软件的软件架构的示意性模块结构图。以下以一个软件,在此称之为“WWW”,的软件架构为例,示出了使用根据本发明的格式对该软件架构进行结构化描述的描述文件。WWW软件的软件架构由一系列模块组成,如图5所示。使用本发明的格式用XML编写的其软件架构的描述文件如下所示< ? xml version = " 1.0〃 encoding = " UTF-8" ? >〈Archversion =" 0. I" author =" linhc" software =" Lotus Connection"software-version = " 7. I" ><ModuleList>〈Module name = " Lotus Connection" prev = " WWW" >〈Entries〉〈Entryname = " I: com/ibm/lconn/core/web/auth/LCUserDataConstraintFilter. doFilter(ServletRequest, ServletResponse, FilterChain)void" />
〈Entryname = “ I com/ibm/1 conn/core/web/auth/LCBasicAuthFi 1 ter. doFilter(ServletRequest,ServletResponse, FilterChain)void" />〈/Entries〉〈/Module〉<Module name =〃 Wffff Servlet" prev =〃 Lotus Connection" >〈Entries〉〈Entryname = " I :com/ibm/ws/webcontainer/servlet/Servlet Wrap per. service (ServletRequest,ServletResponse)void" />〈/Entries〉〈/Module〉〈Module name = 〃 Dogear Access" prev = " WWW" >〈Entries〉〈Entryname = " I : com/ibm/dogear/f i 11er/auth/DogearAuthFi 11er· doFilter(ServletRequest,ServletResponse, FilterChain)void" />〈Entryname = " I : com/ibm/dogear/fi 1 ter/Utf8CharEncodingFi 1 ter. doFilter(ServletRequest,ServletResponse, FilterChain)void" />〈Entryname = " I: com/ibm/dogear/filter/auth/DogearPrivateAccessFilter. doFilter(ServletRequest, ServletResponse, FilterChain) void" />〈Entryname = " I: com/ibm/dogear/filter/stats/RequestStatisticsFilter. doFilter(ServletRequest,ServletResponse, FilterChain)void" />〈/Entries〉〈/Module〉〈Module name = 〃 Wffff Security" prev = " Dogear Access" >〈Entries〉〈Entryname = " I: com/ibm/ws/security/web/FormLoginExtensionProcessor.
handleRequest(Ser
vletRequest, ServletResponse) void" />〈/Entries〉〈/Module〉</ModuleList></Arch>在上述文件中,第1行是XML的声明语句开头。第2行定义了本描述文件的名称为“Arch”,作者是“linhc”,本描述文件描述的软件的名称是“Lotus Connection”,软件版本是“7. 1”。第3行定义了模块列表。第4行定义了模块列表的第一个模块的名称是“WWW ThreadPool”。第5行定义了模块的调用接口。第6行定义了模块的调用接口之一的名称是“ I com/ibm/ws/wswebcontainer/ WebContainer. handleRequest (IRequest, IResponse) void,,。第9行定义了模块列表的第二个模块的名称是“ffffffcontainer”,其前驱模块的名称是“ffffff Thread Pool”。在上述文件的后续部分中,以类似方式对各个模块的属性进行了描述。在本发明的另一个实施例中,使用上述格式产生的软件架构的描述文件自身也具有一些属性,诸如描述文件的版本、描述文件的作者以及描述文件所描述软件的版本、描述文件所描述软件的名称等。利用这些属性,还能够构造不同软件架构的描述文件的库。在该描述文件库中,可以使用某些社会性计算(Social Computing)技术来实现描述文件的共享和协作。下面结合附图给出本发明的优选实施例,但是这里给出的具体描述并非意欲将本发明限于这种特殊的方式,而意欲包括所有的修改、变型和等同等等。图6是示出了根据本发明的另一个实施例的优选的用于增强软件调用栈的可视化的方法的流程图。根据本发明的处理过程开始于步骤601。然后过程前进到步骤603。在步骤603,解析软件架构的描述文件以生成一组模块对象。模块对象与软件模块相对应。这里,描述文件是使用根据本发明的一个优选实施例的格式对软件架构进行结构化描述的文件。所述描述文件可以是用户自己预先生成的,或者从其它用户那里获得的,但是这与本发明并不密切相关。然后过程前进到步骤605。在步骤605,将解析软件调用栈的数据文件而获得的一个调用对象与各个模块对象的调用接口进行比较。然后过程前进到步骤407。如前所述,软件调用栈的数据文件是从现有的!Profiling工具输出的明文文本文件。在步骤607,确定二者是否匹配。如果匹配,过程前进到步骤609。如果不匹配,过程前进到步骤611。这里,“匹配”指的是字符串之间的严格匹配。当然,还可以使用其它匹配方法,只有能够确定调用对象和模块对象的调用接口指示同一方法或函数即可。在步骤609,将匹配的模块对象的属性填充到该调用对象,并将匹配的模块对象标识为系统中的当前匹配的模块对象。然后过程前进到步骤613。在本文中,术语“填充”是指将匹配模块对象的属性与进行比较的对应调用对象相关联,使得由该对应调用对象可以获得其所属的模块对象的属性。在一个实施例中,所述填充是通过把匹配的模块对象的属性写入到内存中的另一地址处并建立从对应的调用对象指向该另一地址的链接来实现的。在另一实施例中,使匹配模块对象的属性成为对应的调用对象的参数之一。例如,模块对象的属性为A,而对应的调用对象为B (C,D),那么所述填充是实现了 B(C,D) — B(C,D,A)。在再一实施例中,所述填充是将匹配模块对象的属性写入与对应的调用对象相邻的地址,例如模块对象的属性和对应的调用对象的存储地址分别为相邻的偶地址和奇地址等。当然也可以使用本领域技术人员设想到的其它方法,只要能够使得由对应的方法/函数可以获得其所属的模块对象的属性即可。在步骤611,将当前匹配的模块对象的属性填充到进行比较的调用对象。由于该进行比较的调用对象与各个模块对象的调用接口都不匹配,这被认为是该调用对象仍在与系统中被标识为当前匹配的模块对象相对应的模块中运行,因此,当前模块对象的属性没有发生改变。因此,将系统中存储的当前匹配的模块对象的属性填充到该调用对象中。然后过程前进到步骤613。在步骤613,确定是否还从软件调用栈的数据文件中解析出另一个调用对象。如果还有其它的调用对象,则返回到步骤605。如果没有,过程前进到步骤615。在步骤615,过程结束。图7是示出了根据本发明的另一个实施例的优选的用于响应于用户输入进行增强软件调用栈的可视化的方法的流程图。根据本发明的处理过程开始于步骤701。然后过程前进到步骤703。在步骤703,使用现有技术中的软件调用栈的可视化工具,由软件调用栈的数据文件生成软件调用栈的可视化。然后过程前进到步骤705。在步骤705,确定是否收到对于将软件架构信息关联到软件调用栈的可视化中的用户请求。如果接收到,则过程前进到步骤707。如果没有接收到,则过程前进到步骤719。在步骤707,解析软件架构的描述文件以生成一组模块对象。模块对象与软件模块相对应。然后过程前进到步骤709。在步骤709,将从软件调用栈的可视化中获得的一个调用对象与各个模块对象的调用接口进行比较。然后过程前进到步骤711。在步骤711,确定二者是否匹配。如果匹配,过程前进到步骤713。如果不匹配,过程前进到步骤715。在步骤713,将匹配的模块对象的属性填充到进行比较的调用对象,并将匹配的模块对象标识为当前匹配的模块对象。然后过程前进到步骤717。在步骤715,将当前匹配的模块对象的属性填充到进行比较的调用对象。然后过程前进到步骤717。在步骤717,确定是否还从软件调用栈的可视化中获得另一调用对象。如果还有其它的调用对象,则返回到步骤709。如果没有,过程前进到步骤719。在步骤719,过程结束。当然,根据本发明的方法不必按照所示出的执行顺序执行。例如,在图7中,步骤707也可以在步骤705或步骤703之前执行。图8是示出了根据本发明的一个实施例的用于增强软件调用栈的可视化的设备的示例性框图。该设备包括软件调用栈可视化引擎801和解析器803。软件调用栈可视化引擎801接收ftOfiling工具输出的软件调用栈的数据文件作为输入。软件调用栈可视化引擎801具有传统的软件调用栈可视化工具的功能,S卩,解析接收到的软件调用栈的数据文件并还原软件调用栈以生成软件调用栈可视化。软件调用栈可视化引擎801还接收来自解析器803的输出作为另一输入。解析器803接收软件架构信息。在本实施例中,该软件架构信息具有软件架构的描述文件的形式。所述描述文件是使用根据本发明的上述格式生成的。所述描述文件可以使用XML编写,但是本发明不限于此。所述描述文件也可以使用任何其它可以被解析的语言来编写。解析器803将接收到的描述文件解析成一组模块对象。根据本发明的软件调用栈可视化引擎801还包括比较模块805和关联模块807。 比较模块805将软件调用栈可视化引擎801从软件调用栈的数据文件解析出的每个调用对象与从解析器803接收的各个模块对象的调用接口进行比较,并将比较结果,即匹配还是不匹配告知关联模块807。关联模块807根据从比较模块805接收的比较结果,将相应的软件架构信息关联到软件调用栈的可视化。如果接收到的比较结果指示匹配,则关联模块807将匹配的模块对象的属性填充到进行比较的调用对象中,并将匹配的模块对象标识为系统中的当前匹配的模块对象。如果接收到的比较结果指示不匹配,则关联模块807将系统中的当前匹配的模块对象的属性填充到进行比较的调用对象中。在另一个实施例中,除了软件调用栈可视化引擎801还可以接收用于请求填充的用户输入和比较单元805从软件调用栈的可视化中获得调用对象之外,该设备中包括的各单元和各单元的功能都与上述实施例的相同。如果根据该实施例的软件调用栈可视化引擎 801没有接收到用户输入,则使用传统的软件调用栈可视化功能由软件调用栈的数据文件产生软件调用栈的可视化,而不考虑来自解析器803的任何输入。如果根据该实施例的软件调用栈可视化引擎801接收到用户输入,则按照针对上述实施例所描述的方式,将来自解析器803的一组模块对象的属性填充到对应的调用对象。在再一个实施例中,除了解析器803也接收用户输入之外,该设备中包括的各单元和各单元的功能都与上述另一个实施例的相同。如果解析器803没有接收到用户输入, 则不解析软件架构的描述文件,从而不给软件调用栈可视化引擎801提供任何输入。如果接收到用户输入,则将软件架构的描述文件解析成一组模块对象,并将其输出给软件调用栈可视化引擎801。这样能够减少对于系统资源的使用。以上例子仅仅示出了将软件架构信息结合到软件调用栈的可视化中的优选方式, 本领域技术人员可以据此设想出其它的实现方式,但是都在本发明的保护范围之内。图9示出了使用根据本发明的软件调用栈可视化窗口提供的查询界面的屏幕截图。图9示出的可视化还是基于图5所示的软件架构。从图9所示的屏幕截图上可以看出, 能够按照软件模块来浏览、过滤、或定位软件调用栈。此外,还可以如图9所示,以不同的颜色来突出显示不同软件模块的调用栈。用不同颜色突出显示仅仅是示例性的,本领域技术人员可以据此设想出其它的可视地区别不同模块的调用栈的方式,但是都在本发明的保护范围之内。图10示出了使用根据本发明的增强的软件调用栈可视化而获得的各个软件模块对系统资源的使用情况的直方图。本发明可以在解析和还原每个调用的方法/函数的同时,针对每个调用的方法/函数,确定其属于哪个模块,并针对该模块累加其中的每个方法 /函数使用的基本CPU周期或字节(这是用于执行调用实体自身的消耗),从而形成如图10 所示的直方图。图11示出了使用根据本发明的增强的软件调用栈可视化而获得的各个软件模块之间的调用关系的示意图。在现有技术中,仅仅可以生成各个方法/函数之间的调用关系, 如图11中的虚线所示。但是不清楚各个调用的方法/函数属于哪个软件模块以及各个软件模块之间的调用关系。由于根据本发明的软件调用栈的可视化具有了软件模块的知识,就可以显示各个软件模块包括那些调用的方法/函数以及软件模块之间的调用关系。在图11所示的调用图形可视化中,同一软件模块的所有方法/函数被分组到一个矩形框——诸如1101、1103、 1105所示——中,一个矩形框代表一个软件模块。软件模块之间的调用被标识为实线。在图11中矩形框的左上角上的文本是模块的名称。矩形框中的各个小方框代表其调用接口, 小方框中的文本是调用接口的名称。此外,通过使用根据本发明的格式来生成对于软件架构进行结构化描述的描述文件,可以建造描述文件库以存储和共享对不同软件架构的描述。该描述文件库使得软件生命周期或软件开发团体中的不同人员贡献其对于软件架构的描述。由于不同人员具有不同知识,对软件理解的不同深度,共享的描述文件库使得能够协作并因而提供对软件架构更深刻的描述。描述文件库能够维护和管理不同人员所贡献的描述文件,按照其属性描述文件的作者、描述文件的版本、描述文件描述的软件的名称、描述文件描述的软件的版本对描述文件进行分类并将其保存到库中。此外,可以将描述文件的某些属性用作为标签。随着描述文件库的增长,能够使用现有技术工具构造用于描述文件的标签以便图示出描述文件的热点和协作趋势。这种方式可以帮助和引导对于描述文件的贡献。图12示出了根据本发明的一个实施例的使用描述文件的属性生成的示例性标签。应该理解,以上出于说明清楚的目的参照不同功能部件和处理器对本发明的实施例进行了描述。显然,在不偏离本发明的条件下,可在不同功能部件或处理器之间使用任何合适的功能分布。例如,所示出的由分立单元或处理器执行的功能可由同一单元或处理器执行。因此,仅将针对具体功能部件的描述视为是对用于提供所述功能的合适装置的描述, 而不表示严格的逻辑或物理结构或组织。此外,在权利要求中特征的顺序并不表示特征起作用的任何特定顺序,特别是在方法权利要求中各步骤的顺序并不表示一定按照该顺序执行这些步骤。而是,这些步骤可采用任何合适的顺序执行。本发明通过使用本发明的实施例的详细说明被描述,这些实施例作为例子被提供,并且不打算限制本发明的范围。所描述的实施例包括不同的特性,不是所有的这些特性在本发明的所有的实施例中都是需要的。本发明的某些实施例仅仅利用某些特性或特性的可能的组合。所描述的本发明的实施例的变例和包括在描述的实施例中指出的特性的不同的组合的本发明的实施例是本领域技术人员将会设想到的。
权利要求
1.一种用于增强软件的软件调用栈的可视化的方法,包括步骤 获得用于描述所述软件的软件架构的软件架构信息;解析所述软件架构信息以生成一组模块对象,其中所述模块对象与所述软件的软件模块相对应;获得所述软件调用栈的调用对象,其中所述调用对象对应于所述软件的运行中执行的方法或函数;将所述模块对象的调用接口与所述调用对象进行比较;以及根据比较结果,将模块对象的对应信息关联到所述软件调用栈的调用对象。
2.如权利要求1所述的方法,其中,所述关联的步骤包括如果所述比较结果指示匹配,则将匹配的模块对象的属性填充到进行比较的调用对象中,并将匹配的模块对象标识为当前匹配的模块对象;以及如果所述比较结果指示不匹配,则将当前匹配的模块对象的属性填充到进行比较的调用对象中。
3.如权利要求2所述的方法,其中,所述填充是通过将匹配的模块对象的属性与进行比较的调用对象相关联以使得由所述调用对象能够获得与其所属的模块相对应的模块对象的属性而实现的。
4.如权利要求3所述的方法,其中,所述填充是通过使用以下方式之一实现的 把当前匹配的模块对象的属性写入到内存中的另一地址处并建立从进行比较的调用对象指向所述另一地址的链接;将当前匹配的模块对象的属性写入与进行比较的调用对象相邻的地址中;和使当前匹配的模块对象的属性成为进行比较的调用对象的参数之一。
5.如权利要求2所述的方法,其中,所述模块对象的属性至少包括模块的名称、模块的调用接口和模块的前驱模块中的一个或多个。
6.如权利要求1所述的方法,其中,所述软件架构信息是使用预定格式结构化描述软件架构的描述文件,其中所述格式描述了软件架构、软件架构的模块的列表和模块的调用接口。
7.如权利要求1所述的方法,其中,所述调用对象是通过解析软件调用栈的数据文件而获得的。
8.如权利要求1所述的方法,还包括步骤使用软件调用栈的数据文件生成软件调用栈的可视化;以及。 当接收到用于请求填充的用户输入时,才执行权利要求1中的各个步骤。
9.如权利要求8所述的方法,其中,所述调用对象是从软件调用栈的可视化中而获得的。
10.如权利要求6所述的方法,其中,所述描述文件具有用于共享和协作目的的属性, 所述描述文件的属性至少包括描述文件的版本、描述文件的作者以及描述文件所描述软件的版本、描述文件所描述软件的名称。
11.如权利要求10所述的方法,还包括步骤使用所述描述文件的一个或多个属性为所述描述文件生成标签。
12.如权利要求1所述的方法,还包括步骤图形显示软件的各个模块对系统资源的使用情况或各个模块之间的调用关系。
13.一种用于增强软件的软件调用栈的可视化的设备,包括用于获得用于描述所述软件的软件架构的软件架构信息的装置; 用于解析所述软件架构信息以生成一组模块对象的装置,其中所述模块对象与所述软件的软件模块相对应;用于获得所述软件调用栈的调用对象的装置,其中所述调用对象对应于所述软件的运行中执行的方法或函数;用于将所述模块对象的调用接口与所述调用对象进行比较的装置;以及用于根据比较结果,将模块对象的对应信息关联到所述软件调用栈的调用对象的装置。
14.如权利要求13所述的设备,其中,所述用于关联的装置包括用于如果所述比较结果指示匹配,则将匹配的模块对象的属性填充到进行比较的调用对象中,并将匹配的模块对象标识为当前匹配的模块对象的装置;以及用于如果所述比较结果指示不匹配,则将当前匹配的模块对象的属性填充到进行比较的调用对象中的装置。
15.如权利要求14所述的设备,其中,所述填充是通过将匹配的模块对象的属性与进行比较的调用对象相关联以使得由所述调用对象能够获得与其所属的模块相对应的模块对象的属性而实现的。
16.如权利要求15所述的设备,其中,所述填充是通过使用以下方式之一实现的 把当前匹配的模块对象的属性写入到内存中的另一地址处并建立从进行比较的调用对象指向所述另一地址的链接;将当前匹配的模块对象的属性写入与进行比较的调用对象相邻的地址中;和使当前匹配的模块对象的属性成为进行比较的调用对象的参数之一。
17.如权利要求14所述的设备,其中,所述模块对象的属性至少包括模块的名称、模块的调用接口和模块的前驱模块中的一个或多个。
18.如权利要求13所述的设备,其中,所述软件架构信息是使用预定格式结构化描述软件架构的描述文件,其中所述格式描述了软件架构、软件架构的模块的列表和模块的调用接口。
19.如权利要求13所述的设备,其中,所述调用对象是通过解析软件调用栈的数据文件而获得的。
20.如权利要求18所述的设备,其中,所述描述文件具有用于共享和协作目的的属性, 所述描述文件的属性至少包括描述文件的版本、描述文件的作者以及描述文件所描述软件的版本、描述文件所描述软件的名称。
21.一种用于增强软件的软件调用栈的可视化的系统,所述系统包括如权利要求13至 20所述的设备。
全文摘要
公开了一种用于增强软件调用栈的可视化的方法、设备和系统。根据本发明的方法包括步骤获得用于描述所述软件的软件架构的软件架构信息;解析所述软件架构信息以生成一组模块对象,其中所述模块对象与所述软件的软件模块相对应;获得所述软件调用栈的调用对象,其中所述调用对象对应于所述软件的运行中执行的方法或函数;将所述模块对象的调用接口与所述调用对象进行比较;以及根据比较结果,将模块对象的对应信息关联到所述软件调用栈的调用对象。通过使用本发明,能够将软件产品的架构信息结合到软件产品的调用栈的可视化中,使得用户能够应用其对软件产品架构的了解来帮助搜索和定位感兴趣模块的执行信息。
文档编号G06F9/44GK102486731SQ20091022583
公开日2012年6月6日 申请日期2009年11月30日 优先权日2009年11月30日
发明者孙剑桥, 林鸿昌, 沈华品, 陈沁悦 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1