《一种代码覆盖测试方法、装置和系统.pdf》由会员分享,可在线阅读,更多相关《一种代码覆盖测试方法、装置和系统.pdf(20页珍藏版)》请在专利查询网上搜索。
1、10申请公布号CN104123218A43申请公布日20141029CN104123218A21申请号201310143177222申请日20130423G06F11/3620060171申请人腾讯科技(深圳)有限公司地址518031广东省深圳市福田区振兴路赛格科技园2栋东403室72发明人谭文74专利代理机构深圳市深佳知识产权代理事务所普通合伙44285代理人唐华明54发明名称一种代码覆盖测试方法、装置和系统57摘要本发明实施例公开了一种代码覆盖测试方法、装置和系统。本发明实施例采用获取源代码编译后产生的二进制文件和符号表,并根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位。
2、置,然后在该二进制文件被加载到内存但未被执行时,根据函数的位置为该二进制文件加载到内存中的映像设置调试点,根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息,最后利用符号表将该代码基本块的相关信息转换成代码行信息,从而获得测试所覆盖的代码行。该方案可以提高测试的可靠性。51INTCL权利要求书3页说明书13页附图3页19中华人民共和国国家知识产权局12发明专利申请权利要求书3页说明书13页附图3页10申请公布号CN104123218ACN104123218A1/3页21一种代码覆盖测试方法,其特征在于,包括获取源代码编译后产生的二进制文件和符号表;根据所述符号表对所。
3、述二进制文件进行解析,以确定每个源代码所定义的函数的位置;在所述二进制文件被加载到内存但未被执行时,根据所述函数的位置为所述二进制文件加载到内存中的映像设置调试点;根据所述调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息;利用所述符号表将所述代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。2根据权利要求1所述的方法,其特征在于,所述根据所述调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息,包括在调试中断,且确定所述中断是因所述调试点的设置而产生时,对引起所述中断的调试点的后面的代码进行指令解码,直至发现跳转点;将引起所述中断的调试。
4、点与所述跳转点之间的代码作为一个执行过的代码基本块,将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中。3根据权利要求1所述的方法,其特征在于,所述将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中,包括将执行过的代码基本块的相关信息记录在在不分页内存中的基本块信息表中。4根据权利要求2或3所述的方法,其特征在于,所述根据所述函数的位置为所述二进制文件加载到内存中的映像设置调试点,包括根据所述函数的位置,在所述二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令;所述在调试中断,且确定所述中断是因所述调试点的设置而产生时,对引起所述中断的调试点的后面的代码。
5、进行指令解码,直至发现跳转点,包括在调试中断,且确定所述中断是因插入的调试中断指令而产生时,对引起所述中断的调试中断指令的后面的代码进行指令解码,直至发现跳转指令。5根据权利要求4所述的方法,其特征在于,若所述跳转指令为解码得到的,则所述发现跳转指令之后,还包括若所述跳转指令为直接跳转指令,则在确定所述基本块信息表中不存在以所述跳转指令的跳转目的为开始地址的代码基本块时,在所述跳转指令所对应的跳转目的位置插入一条调试中断指令;若所述跳转指令为间接跳转指令,则将所述跳转指令替换为一条调试中断指令。6根据权利要求4所述的方法,其特征在于,所述将执行过的代码基本块的相关信息记录在在内存中的基本块信息。
6、表中之后,还包括删除所述插入的调试中断指令。7根据权利要求1至3任一项所述的方法,其特征在于,所述代码基本块的相关信息包括代码基本块的开始地址和结束地址,则所述利用所述符号表将所述代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行,包括权利要求书CN104123218A2/3页3利用所述符号表将所述代码基本块的开始地址和结束地址转换成代码行信息,以获得测试所覆盖的代码行。8一种代码覆盖测试装置,其特征在于,包括获取单元,用于获取源代码编译后产生的二进制文件和符号表;解析单元,用于根据所述符号表对所述二进制文件进行解析,以确定每个源代码所定义的函数的位置;设置单元,用于在所述二进制文。
7、件被加载到内存但未被执行时,根据所述函数的位置为所述二进制文件加载到内存中的映像设置调试点;处理单元,用于根据所述调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息;转换单元,用于利用所述符号表将所述代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。9根据权利要求8所述的代码覆盖测试装置,其特征在于,所述处理单元包括测试子单元和记录子单元;测试子单元,用于在调试中断,且确定所述中断是因所述调试点的设置而产生时,对引起所述中断的调试点的后面的代码进行指令解码,直至发现跳转点;记录子单元,用于将引起所述中断的调试点与所述跳转点之间的代码作为执行过的一个代码基本块。
8、,将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中。10根据权利要求9所述的代码覆盖测试装置,其特征在于,所述记录子单元,具体用于将引起所述中断的调试点与所述跳转点之间的代码作为执行过的一个代码基本块,将执行过的代码基本块的相关信息记录在在不分页内存中的基本块信息表中。11根据权利要求9或10所述的代码覆盖测试装置,其特征在于,所述设置单元,具体用于根据所述函数的位置,在所述二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令;所述测试子单元,具体用于在调试中断,且确定所述中断是因插入的调试中断指令而产生时,对引起所述中断的调试中断指令的后面的代码进行指令解码,直。
9、至发现跳转指令。12根据权利要求11所述的代码覆盖测试装置,其特征在于,所述设置单元,还用于在确定所述跳转指令为解码得到的时,确定所述跳转指令为直接跳转指令还是间接跳转指令,若为直接跳转指令,则在确定所述基本块信息表中不存在以所述跳转指令的跳转目的为开始地址的代码基本块时,在所述跳转指令所对应的跳转目的位置插入一条调试中断指令;若为间接跳转指令,将所述跳转指令替换为一条调试中断指令。13根据权利要求11所述的代码覆盖测试装置,其特征在于,所述处理单元还包括删除子单元;删除子单元,用于删除所述插入的调试中断指令。14根据权利要求8至10任一项所述的代码覆盖测试装置,其特征在于,所述代码基本块的相。
10、关信息包括代码基本块的开始地址和结束地址,则所述转换单元,用于利用所述符号表将所述代码基本块的开始地址和结束地址转换成权利要求书CN104123218A3/3页4代码行信息,以获得测试所覆盖的代码行。15一种通信系统,其特征在于,包括权利要求8至14任一项所述的代码覆盖测试装置。权利要求书CN104123218A1/13页5一种代码覆盖测试方法、装置和系统技术领域0001本发明涉及通信技术领域,具体涉及一种代码覆盖测试方法、装置和系统。背景技术0002代码覆盖测试,指的是用测试的方法来运行代码,并统计在测试中,监控运行到了(即被覆盖)的代码的测试方法。其目的是为了确保测试能覆盖尽量多的代码,以。
11、提高测试的可靠性。代码覆盖有多种评判方法,代码行覆盖就是其中的一种,即一种好的代码覆盖测试方法,应该确保测试能覆盖尽量多的代码行,并明确获知已覆盖的和未覆盖的代码行。0003现有的代码覆盖测试方法主要有两种,如下00041、编译器支持在编译代码的时候,通过指定特殊的编译参数,编译器会生成一个特殊版本的二进制文件,这个二进制文件在每个可执行的代码基本块中插入了特殊的指令,这些特殊的指令会完成一定的功能来记录这个代码基本块已经被执行过了,比如,一般可以通过写一个文件来记录代码的覆盖信息。00052、编译时插入桩代码首先,需要获得被测试程序的源代码,其次,在编译之前,对该源代码进行扫描,并在正确的位。
12、置插入桩代码。其中,桩代码是一种代码片段,能够完成某种记录功能,记录下本行代码被执行到了。该方案一般也是通过写一个文件来记录代码的覆盖信息。0006在对现有技术的研究和实践过程中,本发明的发明人发现,现有的这两种方案的测试代码的二进制文件都发生了实质性改动,因此,测试的可靠性不佳。发明内容0007本发明实施例提供一种代码覆盖测试方法、装置和系统,可以提高测试的可靠性,不但适用于普通的应用程序,而且适用于包括驱动程序的操作系统内核程序,避免测试时系统蓝屏和死机情况。0008一种代码覆盖测试方法,包括0009获取源代码编译后产生的二进制文件和符号表;0010根据所述符号表对所述二进制文件进行解析,。
13、以确定每个源代码所定义的函数的位置;0011在所述二进制文件被加载到内存但未被执行时,根据所述函数的位置为所述二进制文件加载到内存中的映像设置调试点;0012根据所述调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息;0013利用所述符号表将所述代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。0014一种代码覆盖测试装置,包括0015获取单元,用于获取源代码编译后产生的二进制文件和符号表;说明书CN104123218A2/13页60016解析单元,用于根据所述符号表对所述二进制文件进行解析,以确定每个源代码所定义的函数的位置;0017设置单元,用于在所述二。
14、进制文件被加载到内存但未被执行时,根据所述函数的位置为所述二进制文件加载到内存中的映像设置调试点;0018处理单元,用于根据所述调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息;0019转换单元,用于利用所述符号表将所述代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。0020一种通信系统,包括本发明实施例提供的任一种代码覆盖测试装置。0021本发明实施例采用获取源代码编译后产生的二进制文件和符号表,并根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,然后在该二进制文件被加载到内存但未被执行时,根据函数的位置为该二进制文件加载到内存中的。
15、映像设置调试点,根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息,最后利用符号表将该代码基本块的相关信息转换成代码行信息,从而获得测试所覆盖的代码行。由于该方案只在二进制文件加载到内存中的映像设置调试点,并不对二进制文件本身作实质性改动,因此,可以保证实际发布运行的代码编译出的二进制文件和测试所用的二进制文件是同一个文件,大大提高了测试的可靠性,而且,由于设置的是调试点,所以对代码运行的实质影响也极小。附图说明0022为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对。
16、于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。0023图1是本发明实施例提供的代码覆盖测试方法的流程图;0024图2本发明实施例提供的代码覆盖测试方法的另一流程图;0025图3是本发明实施例提供的代码覆盖测试装置的结构示意图;0026图4是本发明实施例提供的终端的结构示意图。具体实施方式0027下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。0028本。
17、发明实施例提供一种代码覆盖测试方法、装置和系统。以下分别进行详细说明。0029实施例一、0030本发明实施例将从代码覆盖测试装置的角度进行描述,该代码覆盖测试装置具体可以集成在终端中,该终端具体可以为智能手机、平板电脑、电子书阅读器、MP3播放器(MOVINGPICTUREEXPERTSGROUPAUDIOLAYERIII,动态影像专家压缩标准音频层面3)、说明书CN104123218A3/13页7MP4(MOVINGPICTUREEXPERTSGROUPAUDIOLAYERIV,动态影像专家压缩标准音频层面3)播放器、膝上型便携计算机和台式计算机等等。0031一种代码覆盖测试方法,包括获取源。
18、代码编译后产生的二进制文件和符号表,根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,在该二进制文件被加载到内存但未被执行时,根据函数的位置为该二进制文件加载到内存中的映像设置调试点,根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息;利用符号表将该代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。0032如图1所示,具体流程可以如下0033101、获取源代码编译后产生的二进制文件和符号表。0034其中,该二进制文件和符号表可以由编译器对需要进行测试的源代码进行编译后得到,即其中,二进制文件指的是源代码编译以后得到的二进制可执行文件。
19、。0035102、根据步骤101获取到的符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,其中,该函数的位置指的是函数在编译之后的实际位置。0036103、在二进制文件被加载到内存但未被执行时,根据函数的位置为二进制文件加载到内存中的映像设置调试点。0037例如,具体可以根据函数的位置,在二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令。即在每个跳转点上设置调试点,比如在每个跳转点上插入一条调试中断指令。0038此时,保存该位置上原有的内容,以便后续可以恢复原样。0039104、根据调试点确定执行过的代码基本块,并在内存中,比如不分页内存中记录执行过的代码基。
20、本块的相关信息。例如,具体可以如下0040在调试中断,且确定该中断是因调试点(即本发明实施例所设置的调试点)的设置而产生时,对引起该中断的调试点的后面的代码进行指令解码,直至发现跳转点(即发现引起该中断的调试点的后面的第一个跳转点);将引起该中断的调试点与该跳转点之间的代码作为执行过的一个代码基本块,将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中。0041其中,解码是指将代码中的信息解析出来,而基本块信息表指的是用于保存该二进制文件中各个代码基本块的相关系信息的一个全局表,一般的,基本块信息表只记录已经执行过的代码基本块,但是,为了显示得更为清楚,在该基本块信息表中,还可以标识这。
21、些代码基本块是否已执行(这里指解码)过。该基本块信息表保存在内存中。0042需说明的是,在应用于内核测试时,可以保存于锁定的不可分页交换内存中,即步骤“将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中”可以包括0043将执行过的代码基本块的相关信息记录在在不分页内存中的基本块信息表中。0044比如,若在步骤103中,已经根据函数的位置,在二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令;则此时,步骤“在调试中断,且确定该中断是因调试点的设置而产生时,对引起所述中断的调试点的后面的代码进行指令解码,直至发现跳转点”具体可以包括0045在调试中断,且确定该中断是因。
22、插入的调试中断指令而产生时,对引起该中断的说明书CN104123218A4/13页8调试中断指令的后面的代码进行指令解码,直至发现跳转指令。0046其中,若该跳转指令是解码得到的,则在发现该跳转指令之后,还可以确定该跳转指令是直接跳转指令还是间接跳转指令,然后进行不同的处理,比如,具体可以如下0047若该跳转指令为直接跳转指令,则在确定该基本块信息表中不存在以该跳转指令的跳转目的为开始地址的代码基本块时,在该跳转指令所对应的函数的开头位置插入一条调试中断指令,即进行如步骤103一样的处理。0048而若该跳转指令为间接跳转指令,则将该跳转指令替换为一条调试中断指令。0049其中,直接跳转指令,指。
23、的是可以根据指令的当前地址,和指令中可直接解码的信息,即可计算出跳转的目标地址的指令,也就是说,该目标地址是固定不变的。而间接跳转指令,指的是跳转的目标地址依赖于系统状态,比如依赖某个寄存器的值和/或某个内存中的值的指令,等等,因而在解码的时候,无法即刻计算出跳转的目标地址,而是需要等待确定了系统的状态后,才能获知跳转的目标地址。0050由于对于间接跳转指令,是无法计算出跳转的目标地址的,即无法了解下一个代码基本块的位置,因此,本发明实施例采用的方法是将该间接跳转指令本身替换成一条调试中断指令。这样,当调试中断再次发生,检查发生的地址,发现原本是一条间接跳转指令的时候,由于此时已经可以获知系统。
24、运行到该跳转指令上时的全部系统状态,比如每个寄存器的值和/或内存单元的值,等等,因此,就可以计算出跳转的目标地址,通过该跳转的目标地址即可知道下一个代码基本块的位置了。0051此外,在将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中之后,还可以将代码恢复为原来的样子,比如删除该插入的调试中断指令,重新替换为原有指令。这样,下次执行到这个代码基本块就不会再发生调试中断了。当这个代码基本块被恢复之后,系统跳到该代码基本块的开始地址正常执行。也就是说,在步骤“将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中”之后,该方法还可以包括0052删除该插入的调试中断指令。0053需说。
25、明的是,以上操作都是中断处理的一部分,但并不一定要在中断处理例程(INTERRUPTHANDLER)中执行。部分复杂耗时的工作,在中断处理例程中无法完成的,亦可在中断处理返回后执行,执行结束后再返回中断发生处继续执行,在此不再赘述。0054105、利用该符号表将该代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。0055其中,代码基本块的相关信息可以包括代码基本块的开始地址和结束地址等信息,即步骤“利用该符号表将该代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行”可以包括0056利用该符号表将该代码基本块的开始地址和结束地址转换成代码行信息,以获得测试所覆盖的代码行。
26、。0057由上可知,本实施例采用获取源代码编译后产生的二进制文件和符号表,并根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,然后在该二进制文件被加载到内存但未被执行时,根据函数的位置为该二进制文件加载到内存中的映像设置调试点,根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息,最后利用符号表将该代码基本块的相关信息转换成代码行信息,从而获得说明书CN104123218A5/13页9测试所覆盖的代码行。由于该方案只在二进制文件加载到内存中的映像设置调试点,并不对二进制文件本身作实质性改动,因此,可以保证实际发布运行的代码编译出的二进制文件和测试所。
27、用的二进制文件是同一个文件,大大提高了测试的可靠性,而且,由于设置的是调试点,所以对代码运行的实质影响也极小。0058此外,由于现有技术都是以直接写某个文件的方法来记录代码的覆盖信息的,但是,在操作系统内核程序(比如WINDOWS系统或者LINUX系统的驱动程序)中,并不是所有的场合都可以读写文件。此外,读写文件本身也是一种对系统的调用操作,会引起驱动程序本身的行为变得不同,因此,现有的这两种方案往往对驱动程序并不适用,在实际测试时容易导致系统蓝屏和死机。而该方案并不依赖文件操作来记录代码的覆盖程度,而是采用在内存中进行记录,必要时采用不可分页交换内存,由于操作不可分页内存是极为安全的操作,几。
28、乎在系统运行的所有场合下均可进行,因此对系统影响极小,可适用于驱动程序,避免因为测试导致的系统蓝屏和死机情况。0059实施例二、0060根据实施例一所描述的方法,以下将举例作进一步详细说明。0061如图2所示,一种代码覆盖测试方法,具体流程可以如下0062201、代码覆盖测试装置获取源代码编译后产生的二进制文件和符号表。0063其中,该二进制文件和符号表可以由编译器对需要进行测试的源代码进行编译后得到。0064202、代码覆盖测试装置根据获取到的符号表对二进制文件进行解析,以确定二进制文件中每个源代码所定义的函数的位置。0065其中,该函数的位置指的是函数在编译之后的实际位置。0066203、。
29、代码覆盖测试装置监控每个二进制文件在操作系统中的加载,在二进制文件被加载到内存但未被执行时,根据函数的位置,在二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令。0067此时,可以保存该位置上原有的内容,以便后续可以恢复原样。0068204、在调试中断发生时,代码覆盖测试装置确定该中断是否因插入的调试中断指令而产生的,若是因插入的调试中断指令而产生的,则对引起该中断的调试中断指令的后面的代码进行指令解码,直至发现跳转指令(此时等于发现了另一个代码基本块,该跳转指令的地址为该另一个代码基本块的开始地址)。0069其中,若该跳转指令是解码得到的,则在发现该跳转指令之后,还可以确。
30、定该跳转指令是直接跳转指令还是间接跳转指令,然后进行不同的处理,比如,具体可以如下0070若该跳转指令为直接跳转指令,则确定该基本块信息表中是否存在以该跳转指令的跳转目的为开始地址的代码基本块,若已经存在,则表明该代码基本块已经被执行过,因此不作处理,而若不存在,则表明该代码基本块还没有被执行过,因此可以在该跳转指令所对应的函数的开头位置插入一条调试中断指令,即进行如步骤203一样的处理,此后的处理也如同其他插入的调试中断指令。0071而若该跳转指令为间接跳转指令,则无法确定其跳转目的。此时直接将该跳转指令替换为一条调试中断指令,此后的处理也如同其他插入的调试中断指令。待调试中断真实发生时,获。
31、得了系统的状态后,计算出跳转目的,再如同直接跳转指令一样的方式处理。说明书CN104123218A6/13页100072此外,若该中断不是因插入的调试中断指令而产生的,则按照现在的处理流程进行处理。0073205、代码覆盖测试装置将引起该中断的调试点与该跳转点之间的代码作为执行过的一个代码基本块,并将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中,比如记录在不分页内存中的基本块信息表中,并标记为已经执行。0074其中,基本块信息表指的是用于保存该二进制文件中各个代码基本块的相关系信息的一个全局表,其中,代码基本块的相关信息可以包括代码基本块的开始地址和结束地址等信息。在该基本块信息。
32、表中,还可以标识这些代码基本块是否已执行过。该基本块信息表保存在内存中。0075此外,在将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中,还可以将代码恢复为原来的样子,比如删除该插入的调试中断指令,这样,下次执行到这个代码基本块就不会再发生调试中断了。当这个代码基本块被恢复之后,系统跳到该代码基本块的开始地址正常执行。0076需说明的是,步骤204和205的操作都是中断处理的一部分,但并不一定要在中断处理例程中执行。部分复杂耗时的工作,在中断处理例程中无法完成的,亦可在中断处理返回后执行,执行结束后再返回中断发生处继续执行,在此不再赘述。0077206、最终在测试的过程中,形成了一。
33、个基本块信息表。当测试人员结束测试,需要获得测试报告的时候,代码覆盖测试装置即可输出该基本块信息表,利用之前获取到的符号表将该基本块信息表中代码基本块的相关信息转换成代码行信息,这样,就可以获得测试所覆盖的代码行。0078由上可知,本实施例采用获取源代码编译后产生的二进制文件和符号表,并根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,然后在该二进制文件被加载到内存但未被执行时,根据函数的位置在该二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令,根据该调试中断指令确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息,最后利用符号表将该代码。
34、基本块的相关信息转换成代码行信息,从而获得测试所覆盖的代码行。由于该方案只在二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令,并不对二进制文件本身作实质性改动,因此,可以保证实际发布运行的代码的二进制文件和测试所用的二进制文件是同一个文件,大大提高了测试的可靠性,而且,由于插入的是一条调试中断指令,所以对代码运行的实质影响也极小。0079此外,该方案并不依赖文件操作来记录代码的覆盖程度,而是采用在内存中进行记录,必要时采用不可分页交换内存,由于操作不可分页内存是极为安全的操作,几乎在系统运行的所有场合均可进行,因此对系统影响极小,可适用于驱动程序,避免因为测试导致的系统蓝。
35、屏和死机情况。0080实施例三、0081根据实施例一和二所描述的方法,以下将以在微软(WINDOWS)系统下,对WINDOWS驱动程序进行测试为例进行说明。应当理解的是,本发明实施例同样可以适用于其他的硬件平台、其他操作系统和其他程序,在此不再赘述。0082在本发明例中,该代码覆盖测试装置可以包括驱动部分模块和一个用户态的控制说明书CN104123218A107/13页11台命令行工具模块,简称命令行工具模块。其中,驱动部分模块可以安装到测试机上,而命令行工具模块则可以直接拷贝到测试机上。其中,这两个模块的功能具体可以如下0083(1)驱动部分模块可以完成以下的功能0084在WINDOWS内核。
36、中,用户可以指定一个被测试驱动的二进制文件及该被测试驱动的函数入口地址列表(即符号表)给该驱动部分模块。如果没有指定,则该驱动部分模块不作任何处理。0085一旦指定了要测试的驱动程序的二进制文件,该驱动部分模块就会监控该要测试的驱动程序的二进制文件(以下称为被测驱动程序)的加载。若发现被测驱动程序的加载,则该驱动部分模块就会修改被测驱动程序在内核中的映像,将所有的函数入口替换成一条INT3指令,其中,该INT3指令为X86硬件平台下的调试指令,机器编码为0XCC,该INT3指令会引起调试中断。0086由于该驱动部分模块已经接管了WINDOWS系统中的调试中断,所以一旦发生调试中断,该驱动部分模。
37、块就首先得到执行,并确定该中断是否因插入的INT3指令而产生的,若是因插入的INT3指令而产生的,则对引起该中断的INT3指令的后面的代码进行指令解码,直至发现跳转指令,并在找到跳转指令的时候,将跳转目的地址上的指令也替换成INT3指令,然后将前一处的INT3指令恢复成原来的代码,让系统继续运行。其中,对于直接跳转指令和间接跳转指令,其处理方法会有所不同,详见前面实施例,在此不再赘述。0087由于后面新加入的INT3指令会继续引起中断发生,所以会这样不断地执行下去,而该驱动部分模块也会记录下每次执行的开始位置和结束(跳转离开)的位置,即可得到每个代码基本块的开始地址和结束地址(即代码基本块的相。
38、关信息),于是,将这些代码基本块的相关信息记录在在不可分页内存中的基本块信息表中。0088(2)命令行工具模块完成以下的功能0089该命令行工具模块可以获取需要测试的驱动程序的二进制文件(以下称为被测驱动程序)及其符号表,并可以根据获取到的符号表对被测驱动程序进行解析,从而确定被测驱动程序中每个源代码所定义的函数的位置,并将这些函数的位置传输给驱动部分模块。0090在测试结束之后,可以通过该命令行工具模块将该基本块信息表中代码基本块的相关信息转换成代码行信息,这样,就可以获得测试所覆盖的代码行。0091需说明的是,以上仅仅只是本发明实施例的一个范例,应当理解的是,具体实施时,还可以采用多种方式。
39、,比如采用更多的展示方式来展示测试结果,等等,在此不再赘述。0092由上可知,本实施例采用获取被测驱动程序和符号表,并根据该符号表对该被测驱动程序进行解析,以确定每个源代码所定义的函数的位置,然后在该二进制文件被加载到内存但未被执行时,根据函数的位置在被测驱动程序加载到内存中的映像中的每个函数的开头位置插入一条INT3指令,根据该INT3指令确定执行过的代码基本块,并在不可分页内存中记录执行过的代码基本块的相关信息,最后利用符号表将该代码基本块的相关信息转换成代码行信息,从而获得测试所覆盖的代码行。由于该方案只在被测驱动程序加载到内存中的映像中的每个函数的开头位置插入一条INT3指令,并不对被。
40、测驱动程序本身作实质性改动,因此,可以保证实际发布运行的驱动程序和被测驱动程序是同一个文件,大大提高了测试的可靠性,而且,由于插入的是一条INT3指令,所以对代码的实质影响也极小;此外,该方案并不依赖文件操作来记录代码的覆盖程度,而是采用在不可分页内存中进行说明书CN104123218A118/13页12记录,由于操作不可分页内存是极为安全的操作,几乎在系统运行的所有场合均可进行,因此对系统影响极小,可适用于驱动程序,避免因为测试导致的系统蓝屏和死机情况。0093实施例四、0094相应的,本发明实施例还提供一种代码覆盖测试装置,如图3所示,该代码覆盖测试装置可以包括获取单元301、解析单元30。
41、2、设置单元303、处理单元304和转换单元305。0095获取单元301,用于获取源代码编译后产生的二进制文件和符号表;0096其中,该二进制文件和符号表可以由编译器对需要进行测试的源代码进行编译后得到。0097解析单元302,用于根据该符号表对所述二进制文件进行解析,以确定每个源代码所定义的函数的位置;0098设置单元303,用于在该二进制文件被加载到内存但未被执行时,根据该函数的位置为所述二进制文件加载到内存中的映像设置调试点;0099处理单元304,用于根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息;0100比如,具体可以在不可分页内存中记录执行过的代码。
42、基本块的相关信息。0101转换单元305,用于利用该符号表将该代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。0102其中,代码基本块的相关信息可以包括代码基本块的开始地址和结束地址等信息,即0103转换单元305,具体可以用于利用该符号表将该代码基本块的开始地址和结束地址转换成代码行信息,以获得测试所覆盖的代码行。0104可选的,其中,处理单元304可以包括测试子单元和记录子单元;0105测试子单元,用于在调试中断,且确定该中断是因调试点(即设置单元303所设置的调试点)的设置而产生时,对引起该中断的调试点的后面的代码进行指令解码,直至发现跳转点(即发现引起该中断的调试点的后。
43、面的第一个跳转点);0106记录子单元,用于将引起该中断的调试点与该跳转点之间的代码作为执行过的一个代码基本块,将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中。比如,具体可以将执行过的代码基本块的相关信息记录在在不可分页内存中的基本块信息表中。0107其中,解码是指将代码中的信息解析出来,而基本块信息表指的是用于保存该二进制文件中各个代码基本块的相关系信息的一个全局表,一般的,基本块信息表只记录已经执行过的代码基本块,但是,为了显示得更为清楚,在该基本块信息表中,还可以标识这些代码基本块是否已执行过。该基本块信息表保存在内存中。0108例如,设置单元302,具体可以用于根据该函数。
44、的位置,在该二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令;0109则此时,测试子单元,具体可以用于在调试中断,且确定该中断是因插入的调试中断指令而产生时,对引起该中断的调试中断指令的后面的代码进行指令解码,直至发现跳转指令。0110其中,若该跳转指令是解码得到的,则在发现该跳转指令之后,还可以确定该跳转说明书CN104123218A129/13页13指令是直接跳转指令还是间接跳转指令,然后进行不同的处理,比如,具体可以如下0111设置单元302,还可以用于在确定该跳转指令为解码得到的时,确定该跳转指令为直接跳转指令还是间接跳转指令,若为直接跳转指令,则在确定该基本块信。
45、息表中不存在以该跳转指令的跳转目的为开始地址的代码基本块时,在该跳转指令所对应的函数的开头位置插入一条调试中断指令;若为接跳转指令,则将该跳转指令替换为一条调试中断指令。0112此外,在将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中之后,还可以将代码恢复为原来的样子,比如删除该插入的调试中断指令,这样,下次执行到这个代码基本块就不会再发生调试中断了。当这个代码基本块被恢复之后,系统跳到该代码基本块的开始地址正常执行。即处理单元304还可以包括删除子单元;0113删除子单元,用于删除该插入的调试中断指令。0114具体实施时,以上各个单元可以作为独立的实体来实现,也可以进行任意组合,。
46、作为同一或若干个实体来实现,比如,通过实施例三中的驱动部分模块和命令行工具模块来实现,等等,以上各个单元的实施,具体可参见前面的实施例,在此不再赘述。0115该代码覆盖测试装置具体可以集成在终端中,该终端具体可以为智能手机、平板电脑、电子书阅读器、MP3播放器、MP4播放器、膝上型便携计算机和台式计算机等等。0116由上可知,本实施例的代码覆盖测试装置的获取单元301可以获取源代码编译后产生的二进制文件和符号表,并由解析单元302根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,然后在该二进制文件被加载到内存但未被执行时,由设置单元303根据函数的位置为该二进制文件加载到内。
47、存中的映像设置调试点,并由处理单元304根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息,最后由转换单元305利用符号表将该代码基本块的相关信息转换成代码行信息,从而获得测试所覆盖的代码行。由于该方案只在二进制文件加载到内存中的映像设置调试点,并不对二进制文件本身作实质性改动,因此,可以保证实际发布运行的代码编译后产生的二进制文件和测试所用的二进制文件是同一个文件,大大提高了测试的可靠性,而且,由于设置的是调试点,所以对代码运行的实质影响也极小。0117此外,该方案并不依赖文件操作来记录代码的覆盖程度,而是采用在内存中进行记录,必要时采用不可分页交换内存,由于操作。
48、不可分页内存是极为安全的操作,几乎在系统运行的所有场合均可进行,因此对系统影响极小,可适用于驱动程序,避免因为测试导致的系统蓝屏和死机情况。0118实施例五、0119相应的,本发明实施例还提供一种通信系统,包括本发明实施例提供的任一种代码覆盖测试装置,该代码覆盖测试装置具体可参见实施例四,例如,具体可以如下0120代码覆盖测试装置,用于获取源代码编译后产生的二进制文件和符号表,根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,在该二进制文件被加载到内存但未被执行时,根据函数的位置为该二进制文件加载到内存中的映像设置调试点,根据该调试点确定执行过的代码基本块,并在内存中记录执。
49、行过的代码基本块的相关信息;利用符号表将该代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行,具体可参见前面的实施例,在此不再赘述。0121该代码覆盖测试装置具体可以集成在终端中,该终端具体可以为智能手机、平板说明书CN104123218A1310/13页14电脑、电子书阅读器、MP3播放器、MP4播放器、膝上型便携计算机和台式计算机等等。0122该通信系统可以实现本发明实施例所提供的浏览器页面数据过滤装置同样的有益效果,在此不再赘述。0123实施例六、0124相应的,本发明实施例还提供一种终端,如图4所示,该终端可以包括射频(RF,RADIOFREQUENCY)电路401、包括有。
50、一个或一个以上计算机可读存储介质的存储器402、输入单元403、显示单元404、传感器405、音频电路406、无线保真(WIFI,WIRELESSFIDELITY模块407、包括有一个或者一个以上处理核心的处理器408、以及电源409等部件。本领域技术人员可以理解,图4中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中0125RF电路401可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,交由一个或者一个以上处理器408处理;另外,将涉及上行的数据发送给基站。通常,RF电路401包括但不限于天线、至少一个。