用以获得应用程序代码执行率的仿真装置及其方法

文档序号:6651163阅读:207来源:国知局
专利名称:用以获得应用程序代码执行率的仿真装置及其方法
技术领域
本发明涉及一种仿真(Simulation)系统及方法,尤其涉及一种用以获得应用程序代码执行率的仿真装置及其方法。
背景技术
代码覆盖率(Code Coverage)是用以衡量应用程序代码的执行效率的一个重要指标,因此,对于代码覆盖率的衡量与计算也是一种重要的软件技术。
目前,比较流行的代码覆盖率的计算技术,是在用户程序编译时,在应用程序中插入特殊的代码或指令,称为桩点,并根据插入的位置等信息构建数据库,当程序运行到桩点时,特殊指令被执行,产生特定的动作,如进入异常(exception)处理程序,或向特定地址写入特定的数据等,动作目的是通知相应的分析模块,告知该桩点已被执行,分析模块根据之前建好的数据库信息,以及所经过的桩点信息,分析统计出代码的执行覆盖率等。
打桩技术一般应用于c,c++代码,通常需要编译器(compiler)配合,编译时打入桩点,或者在进行编译之前,需要特殊的预处理模块对源文件进行特别的预处理(比如在源文件中程序分支或语句,函数之后插入特殊的代码),再通过编译器生成目标代码。
然而,这种方式的主要缺点为1、需要编译器进行调整修改,或提供专门的原文件预处理模块。
2、由于是在文件中插入代码或特殊指令,在一定的程度上影响程序的执行,同时特殊代码的执行本身需要执行时间,消耗一定的资源,所以打桩后的程序与最终的目标程序存在差别,统计结果存在一定的误差,甚至执行流程结果会产生错误。
3、存在打桩密度问题,即在何处打桩,打多少桩,如果打桩太少将不能有效的统计,太多则严重影响执行效率与统计结果误差。
4、对于汇编语言编写的代码有可能不能很好的处理。
此外,还有一些硬件技术,例如通过片上两个计数器和两个触发控制寄存器的工作,提供对软件性能剖析功能的支持。虽然这种技术进行代码剖析时,不需打桩插入代码,且不会因此影响程序执行的速度,但由于它需要一定的硬件资源的支持,且一次只能对部分代码进行性能剖析,因此,使用不方便,且需增加额外的电路成本。
由此可见,如何提供一种方便快捷的计算应用程序代码覆盖率的系统及方法,已经成为业内亟待解决的问题。

发明内容
本发明所要解决的技术问题在于提供一种用以获得代码覆盖率的仿真装置及其方法,其不需要对程序进行打桩,可方便快捷的计算应用程序代码覆盖率。
为解决上述技术问题,本发明提供一种用以获得应用程序代码执行率的仿真装置,包括系统模拟模块,用于实现对CPU及各功能模块的模拟,根据所述应用程序代码的运行情况,提供执行代码指令的参数信息;调试信息获取模块,用于获取编译器在编译操作后产生的调试信息,提供所述应用程序的每一行代码与程序指针的对应关系;代码统计模块,用于根据系统模拟模块提供的执行代码指令的参数信息,与调试信息获取模块提供的应用程序的每一行代码与程序指针的对应关系,对应用程序代码的执行率进行计算。
本发明还可以进一步包括外设功能模拟模块,与所述系统模拟模块相连,用于实现对受控于系统模拟模块的外设功能的模拟。
本发明还提供一种利用仿真装置获得应用程序代码执行率的方法,包括如下步骤
(1)利用仿真装置模拟应用程序运行的计算机环境;(2)编译所述应用程序的源代码,产生执行代码以及每一行代码与程序指针的对应关系;(3)由仿真装置运行执行代码,并根据所述代码的运行情况,记录执行代码指令的参数信息;(4)根据所述执行代码指令的参数信息,与应用程序的每一行代码与程序指针的对应关系,计算出应用程序代码的执行率。
本发明不需要编译器特殊处理,以及特别的源文件预处理模块。程序中不需要打桩,不破坏目标应用程序,目标程序与被测试程序一致,不存在执行误差,以及额外的时钟周期消耗。每一条语句指令都可得到统计分析,可以说是最密的打桩密度,统计结果准确。


图1为根据本发明实施例所述的获得应用程序代码执行率的仿真装置结构示意图;图2为根据本发明实施例所述的代码统计模块示意图;图3为根据本发明实施例所述的可获得应用程序代码执行率的仿真方法流程示意图;图4为根据本发明实施例所述的运行执行代码的流程示意图。
具体实施例方式
仿真装置(Simulator),就是使用计算机的资源来模拟内含有MPU/MCU(主处理单元)控制的任何计算机装置的一种功能模拟器。它通常被作为以MPU/MCU控制的电子产品的开发工具而提供给MPU/MCU用户。
如图1所示,为根据本发明实施例所述的获得应用程序代码执行率的仿真装置1,包括系统模拟模块11、外设功能模拟模块12、调试信息获取模块13,以及代码统计模块14。
其中,所述系统模拟模块11实现对CPU的模拟和MPU中其它功能模块的模拟;所述外设功能模拟模块12实现对受控于MPU的一些外设功能的模拟;调试(Debug)信息获取模块13用于获取编译器在编译链接操作后产生的调试(Debug)信息,提供所述应用程序的每一行代码与程序指针的对应关系;代码统计模块14用于根据系统模拟模块提供的执行代码指令的指令序列与调试(Debug)信息获取模块13获取的所述应用程序的每一行代码与程序指针的对应关系获得代码覆盖率和函数的执行覆盖率,同时,代码统计模块14还可以用于根据系统模拟模块提供的记录每条指令所消耗的CPU时钟周期和调试(Debug)信息获取模块13提供的调试(Debug)信息以获得程序的执行效率。
现有的仿真装置一般都具有MPU系统模拟模块,以及受控的外设功能模拟模块,因此,实施本发明,可以充分利用现有仿真装置中的功能模块。
如图1所示,MPU系统模拟模块11可以包括CPU模拟单元、存储器单元、定时器功能单元、中断功能单元、外设接口单元。
CPU模拟单元是仿真装置的核心,其包括对CPU指令操作码的模拟和对CPU资源的模拟,通过PC(Program Counter,程序指针)指向要模拟的指令操作码地址,从存储器单元的该地址中取出该要模拟的指令码,解释、并执行该指令码。每模拟执行完一条指令码,就要更新PC、CCC(Cpu CycleCounter,CPU时钟周期计数器)中的内容,为下一条指令的模拟执行准备,同时,也提供出CPU重要的资源,即CPU的空间、时间资源,尤其是CCC的内容,即模拟的CPU时钟周期,可以作为系统的时间基准被提供。
一般来说,PC里面可以写8-bit数据,但是其实只有0--15是有意义的,它就是指令段的地址。而所谓“程序指针”的意义,就是说“CPU下一步要执行的工作,便是PC内容所指的地址”。
例如,假定硬件平台为860T,时钟为50MHz;SDRAM空间4M×32bit,地址范围从0x00000000~0x00FFFFFF,访问时间10ns;Flash空间512K×8bit,访问时间为100ns,地址范围从0x02800000~0x0287FFFF(至于其它单片机,运行原理大致相同,可以类推)。860T在上电后,PC(Program Counter)=0x2800100,程序从PC指定的地方执行,首先执行初始化代码(BootCode),再执行主程序(AppCode)。程序从Flash中读取指令代码(code),来完成数据的传输。
此外,一条机器指令一般就是指一行源代码。一个软件的源代码行数不包括程序注释、作业命令、调试程序在内。
如图1所示,存储器单元可以包括一组特殊功能寄存器连接定时器功能单元、中断功能单元、外设接口单元。通常,可以用计算机的存储器资源来模拟MPU的存储器,用计算机的存储器单元来模拟MPU中特殊功能寄存器单元(譬如实现定时器功能的各个单元,实现中断功能的各个单元,以及实现各I/O接口功能的各个单元等等),并通过编写一些软件来模拟这些特殊功能寄存器单元的功能。通过对CPU指令操作码的模拟执行,会对MPU的存储器进行读写操作,尤其是对一系列的特殊功能寄存器进行读写操作,这些读写操作便会触发上述特殊功能寄存器单元模拟软件的执行,从而实现MPU各功能模块的模拟。
外设功能模拟模块12,可以包括LCD功能单元、键盘功能单元、音频功能单元、其它功能单元。对MPU控制的上述各个外设功能的模拟可通过在计算机显示器上编写出各种GUI,来提供各外设功能的支持。譬如,在显示器上编写出受MPU控制的LCD各种操作UI,如LCD设置UI、LCD显示UI,键盘的I/O设置UI、键盘使用显示UI等等。当然,上述各外设的使用显示内容要相应于上述CPU指令码的模拟执行,即通过对MPU各个特殊功能寄存器的读写操作的模拟,才可真正实现各外设的功能。
如图2所示,代码统计模块14还可以进一步包括代码覆盖率模块141,与代码执行效率模块142。
其中,代码覆盖率模块141用于根据调试(Debug)信息获取模块13提供的调试(Debug)信息中的每一行代码对应的PC的信息,根据仿真装置1的系统模拟模块执行指令的PC序列,可分析出源代码中每一行是否被执行过,计算出其代码覆盖率。
其中,计算代码覆盖率的公式为代码覆盖率=被执行过的代码行数/总的代码行数。
代码覆盖率的处理中,除可分析出源代码中每一行是否被执行过外,还可以进一步分析源代码中每一行被执行的次数。
此外,代码覆盖率模块141,还用于根据调试(Debug)信息获取模块13提供的调试(Debug)信息中函数的起始地址(PC)与结束地址(PC),可以确定其在源代码中对应的行信息即函数的总行数,根据之前分析的每行被执行的状况可分析统计出函数的执行覆盖率。
其中,计算函数的执行覆盖率的公式为函数的执行覆盖率=函数中被执行的行数/函数总行数。
如图2所示,代码执行效率模块142,可以通过记录每一条指令所消耗的CPU时钟周期,并通过调试(Debug)获取模块13提供的调试(Debug)统计出源代码中每一行消耗的CPU时钟周期。
其中,所述的调试(Debug)获取模块13提供的调试(Debug)是指行(line)与指令(PC)的对应关系,其将上述每一条指令所消耗的CPU时钟周期加到对应的行(line)中,可以统计出源代码中每一行消耗的CPU时钟周期,即代码执行效率。
此外,代码执行效率模块142,还可以对函数执行效率进行统计,通过建立函数的调用栈,对仿真装置1执行的每一条指令进行分析,如果是函数调用(call)指令,则将当前的PC以及被调用的函数PC、当前仿真装置运行的总CPU时钟周期压入栈中,执行结束后,用当前仿真装置运行的总CPU时钟周期减去之前记录的CPU时钟周期,结果即为函数运行消耗的CPU时钟周期,记录该结果。根据之前记录的PC值,将函数执行的周期记录到对应的行(line)中,再从栈中弹出之前压入的相应内容。
参见图3,为根据本发明实施例所述的可获得应用程序代码执行率的仿真方法流程示意图,首先利用仿真装置模拟应用程序运行的计算机环境(步骤301);然后编译所述应用程序的源代码,产生执行代码(target file)以及每一行代码与程序指针的对应关系(步骤302);由仿真装置运行执行代码,并记录执行代码指令的参数信息,例如每条指令的程序指针序列以及每条指令消耗的CPU时钟周期等(步骤303);根据所述每一行代码与程序指针的对应关系、CPU时钟周期,以及程序指针序列等参数信息,分析每一行代码是否被执行过,从而计算出所述应用程序的代码覆盖率以及执行效率等信息(步骤304)。
其中,可以利用上述的仿真装置模拟出目标程序运行的计算机软硬件环境;在源代码经过编译处理后,产生目标系统的执行代码,同时产生debug信息;然后运行执行代码,启动代码统计模块,记录每条指令执行消耗的CPU时钟周期数和每条指令的PC;代码统计模块根据记录每条指令所消耗的CPU时钟周期和Debug信息获得代码覆盖率、函数的执行覆盖率和程序的执行效率等信息。
其中,对于代码覆盖率的处理,可以利用上述的代码覆盖率模块,通过调试信息中的每一行对应的PC的信息,根据仿真装置执行指令的PC序列,分析出源代码中每一行是否被执行过,从而计算出其代码覆盖率。其中,计算代码覆盖率的公式为代码覆盖率=被执行过的代码行/总的代码行数代码覆盖率的处理中,除可分析出源代码中每一行是否被执行过外,还能分析出源代码中每一行被执行的次数。
对于一个函数的执行覆盖率统计,可以根据debug信息中函数的起始与结束PC可以确定其在源代码中对应的行信息,根据之前分析的每行被执行的状况可分析统计出函数中的执行覆盖率。
其中,计算函数的执行覆盖率的公式为函数的执行覆盖率=函数中被执行的行数/函数总行数。
对于执行效率的统计处理,可以利用上述代码执行效率模块根据每一条指令所消耗的周期,通过debug信息统计出源代码中每一行消耗的CPU时钟周期,即代码执行效率。
对于函数的执行效率的处理,可以通过建立函数的调用栈,对仿真装置1执行的每一条指令进行分析,如果是函数调用(call)指令,则将当前的PC以及被调用的函数PC、当前仿真装置运行的总CPU时钟周期压入栈中,执行结束后,用当前仿真装置运行的总CPU时钟周期减去之前记录的CPU时钟周期,结果即为函数运行消耗的CPU时钟周期,记录该结果。根据之前记录的PC值,将函数执行的周期记录到对应的行(line)中,再从栈中弹出之前压入的相应内容。
如图4所示,为根据本发明实施例所述的运行执行代码的流程示意图。首先,初始化PC、CCC(Cpu Cycle Counter)(步骤401);然后通过PC指向要模拟的指令操作码地址,从存储器的该地址中取出该要模拟的指令码(步骤402);更新PC、CCC中的内容(步骤403、404);解释、并执行该指令码(步骤405);判断是否需要中断处理(步骤406);若是,进行必要的处理,调整PC(步骤407);若否,则判断是否继续仿真装置执行代码的运行(步骤408);若是,则返回步骤402;若否,则停止仿真装置执行代码的运行。
这样,就可以通过仿真装置在计算机上模拟出目标应用程序运行的软硬件环境,并模拟实际环境的时钟周期。在仿真装置运行目标应用程序时,仿真装置会记录应用程序执行的指令序列,即程序运行所经过的每一条指令的PC以及每条指令所消耗的CPU时钟周期。建立数据库,通过编译器生成的debug信息,将可以得到每条PC对应的原文件的行号,文件名等信息。结合数据库中经过的每一条PC信息,与debug信息可以分析统计出原文件的代码执行覆盖率,以及每个函数,每一条语句的执行效率。
权利要求
1.一种用以获得应用程序代码执行率的仿真装置,其特征在于,包括系统模拟模块,用于实现对CPU及各功能模块的模拟,根据所述应用程序代码的运行情况,提供执行代码指令的参数信息;调试信息获取模块,用于获取编译器在编译操作后产生的调试信息,提供所述应用程序的每一行代码与程序指针的对应关系;代码统计模块,用于根据系统模拟模块提供的执行代码指令的参数信息,与调试信息获取模块提供的应用程序的每一行代码与程序指针的对应关系,对应用程序代码的执行率进行计算。
2.如权利要求1所述的装置,其特征在于,进一步包括外设功能模拟模块,与所述系统模拟模块相连,用于实现对受控于系统模拟模块的外设功能的模拟。
3.如权利要求1所述的装置,其特征在于所述系统模拟模块,提供的执行代码指令参数信息包括程序指针序列信息;所述代码统计模块,包括代码覆盖率模块,用于根据系统模拟模块提供的程序指针序列信息,与调试信息获取模块提供的应用程序的每一行代码与程序指针的对应关系,分析所述应用程序的每一行代码是否被执行过,从而计算出所述应用程序的代码覆盖率。
4.如权利要求3所述的装置,其特征在于,所述代码覆盖率模块,进一步根据系统模拟模块提供的程序指针序列信息,与调试信息获取模块提供的应用程序的每一行代码与程序指针的对应关系,分析出所述应用程序的每一行代码被执行的次数。
5.如权利要求3所述的装置,其特征在于所述调试信息获取模块,进一步提供应用程序执行中函数的起始地址与结束地址给所述代码覆盖率模块;所述代码覆盖率模块,进一步根据系统模拟模块提供的程序指针序列信息、调试信息获取模块提供的应用程序的每一行代码与程序指针的对应关系,以及调试信息获取模块提供的函数起始地址与结束地址,确定函数在应用程序代码中对应的行信息,进而计算出函数的执行覆盖率。
6.如权利要求1所述的装置,其特征在于所述系统模拟模块,提供的执行代码指令参数信息包括每条指令消耗的CPU时钟周期信息;所述代码统计模块,包括代码执行效率模块,用于根据系统模拟模块提供的CPU时钟周期信息,与调试信息获取模块提供的所述应用程序的每一行代码与程序指针的对应关系,计算出每一行代码消耗的CPU时钟周期。
7.如权利要求6所述的装置,其特征在于,所述的代码执行效率模块,进一步根据系统模拟模块提供的CPU时钟周期信息,与调试信息获取模块提供的所述应用程序的每一行代码与程序指针的对应关系,分析其中的函数调用指令,计算出函数执行效率。
8.一种利用仿真装置获得应用程序代码执行率的方法,其特征在于,包括如下步骤(1)利用仿真装置模拟应用程序运行的计算机环境;(2)编译所述应用程序的源代码,产生执行代码以及每一行代码与程序指针的对应关系;(3)由仿真装置运行执行代码,并根据所述代码的运行情况,记录执行代码指令的参数信息;(4)根据所述执行代码指令的参数信息,与应用程序的每一行代码与程序指针的对应关系,计算出应用程序代码的执行率。
9.如权利要求8所述的方法,其特征在于步骤(3)所述的执行代码指令的参数信息,包括程序指针序列信息;步骤(4)所述计算出应用程序代码的执行率,包括根据程序指针序列信息,与应用程序的每一行代码与程序指针的对应关系,分析所述应用程序的每一行代码是否被执行过,从而计算出所述应用程序的代码覆盖率。
10.如权利要求9所述的方法,其特征在于,计算代码覆盖率的公式为代码覆盖率=被执行过的代码行数/总的代码行数。
11.如权利要求9所述的方法,其特征在于,所述步骤(4),进一步包括根据程序指针序列信息,与应用程序的每一行代码与程序指针的对应关系,分析出所述应用程序的每一行代码被执行的次数。
12.如权利要求9所述的方法,其特征在于所述步骤(2),进一步产生应用程序执行中函数的起始地址与结束地址;所述步骤(4),进一步根据程序指针序列信息、应用程序的每一行代码与程序指针的对应关系,以及函数起始地址与结束地址,确定函数在应用程序代码中对应的行信息,进而计算出函数的执行覆盖率。
13.如权利要求12所述的方法,其特征在于,所述计算函数的执行覆盖率的公式为函数的执行覆盖率=函数中被执行的行数/函数总行数。
14.如权利要求8所述的方法,其特征在于步骤(3)所述的执行代码指令的参数信息,包括每条指令消耗的CPU时钟周期;步骤(4)所述计算出应用程序代码的执行率,包括根据所述CPU时钟周期信息,与应用程序的每一行代码与程序指针的对应关系,计算出每一行代码消耗的CPU时钟周期。
15.如权利要求14所述的方法,其特征在于,所述步骤(4)进一步根据CPU时钟周期信息,与应用程序的每一行代码与程序指针的对应关系,分析代码中的函数调用指令,计算出函数执行效率。
16.如权利要求15所述的方法,其特征在于,所述计算函数执行效率的步骤,包括对每一条指令进行分析,如果是函数调用指令,则将当前的程序指针以及被调用函数的程序指针、当前仿真装置运行的总CPU时钟周期压入栈中;执行结束后,用当前仿真装置运行的总CPU时钟周期减去之前记录的CPU时钟周期,将该结果记录为函数运行消耗的CPU时钟周期;根据之前记录的程序指针值,将函数执行的周期记录到对应的代码行中,再从栈中弹出之前压入的相应内容。
全文摘要
本发明公开了一种用以获得应用程序代码执行率的仿真装置及其方法,包括系统模拟模块,用于实现对CPU及各功能模块的模拟,根据所述应用程序代码的运行情况,提供执行代码指令的参数信息;外设功能模拟模块,与所述系统模拟模块相连,用于实现对受控于系统模拟模块的外设功能的模拟;调试信息获取模块,用于获取编译器在编译操作后产生的调试信息,提供所述应用程序的每一行代码与程序指针的对应关系;代码统计模块,用于根据系统模拟模块提供的执行代码指令的参数信息,与调试信息获取模块提供的应用程序的每一行代码与程序指针的对应关系,对应用程序代码的执行率进行计算。本发明方便快捷的实现了对代码覆盖率以及执行效率的统计。
文档编号G06F9/45GK1979422SQ200510127728
公开日2007年6月13日 申请日期2005年12月2日 优先权日2005年12月2日
发明者刘凯, 杨有成 申请人:凌阳科技股份有限公司, 北京北阳电子技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1