CN104123218A - 一种代码覆盖测试方法、装置和系统 - Google Patents
一种代码覆盖测试方法、装置和系统 Download PDFInfo
- Publication number
- CN104123218A CN104123218A CN201310143177.2A CN201310143177A CN104123218A CN 104123218 A CN104123218 A CN 104123218A CN 201310143177 A CN201310143177 A CN 201310143177A CN 104123218 A CN104123218 A CN 104123218A
- Authority
- CN
- China
- Prior art keywords
- code
- fundamental block
- instruction
- binary file
- internal memory
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3676—Test management for coverage analysis
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明实施例公开了一种代码覆盖测试方法、装置和系统。本发明实施例采用获取源代码编译后产生的二进制文件和符号表,并根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,然后在该二进制文件被加载到内存但未被执行时,根据函数的位置为该二进制文件加载到内存中的映像设置调试点,根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息,最后利用符号表将该代码基本块的相关信息转换成代码行信息,从而获得测试所覆盖的代码行。该方案可以提高测试的可靠性。
Description
技术领域
本发明涉及通信技术领域,具体涉及一种代码覆盖测试方法、装置和系统。
背景技术
代码覆盖测试,指的是用测试的方法来运行代码,并统计在测试中,监控运行到了(即被覆盖)的代码的测试方法。其目的是为了确保测试能覆盖尽量多的代码,以提高测试的可靠性。代码覆盖有多种评判方法,代码行覆盖就是其中的一种,即一种好的代码覆盖测试方法,应该确保测试能覆盖尽量多的代码行,并明确获知已覆盖的和未覆盖的代码行。
现有的代码覆盖测试方法主要有两种,如下:
1、编译器支持:在编译代码的时候,通过指定特殊的编译参数,编译器会生成一个特殊版本的二进制文件,这个二进制文件在每个可执行的代码基本块中插入了特殊的指令,这些特殊的指令会完成一定的功能来记录这个代码基本块已经被执行过了,比如,一般可以通过写一个文件来记录代码的覆盖信息。
2、编译时插入桩代码:首先,需要获得被测试程序的源代码,其次,在编译之前,对该源代码进行扫描,并在正确的位置插入桩代码。其中,桩代码是一种代码片段,能够完成某种记录功能,记录下本行代码被执行到了。该方案一般也是通过写一个文件来记录代码的覆盖信息。
在对现有技术的研究和实践过程中,本发明的发明人发现,现有的这两种方案的测试代码的二进制文件都发生了实质性改动,因此,测试的可靠性不佳。
发明内容
本发明实施例提供一种代码覆盖测试方法、装置和系统,可以提高测试的可靠性,不但适用于普通的应用程序,而且适用于包括驱动程序的操作系统内核程序,避免测试时系统蓝屏和死机情况。
一种代码覆盖测试方法,包括:
获取源代码编译后产生的二进制文件和符号表;
根据所述符号表对所述二进制文件进行解析,以确定每个源代码所定义的函数的位置;
在所述二进制文件被加载到内存但未被执行时,根据所述函数的位置为所述二进制文件加载到内存中的映像设置调试点;
根据所述调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息;
利用所述符号表将所述代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。
一种代码覆盖测试装置,包括:
获取单元,用于获取源代码编译后产生的二进制文件和符号表;
解析单元,用于根据所述符号表对所述二进制文件进行解析,以确定每个源代码所定义的函数的位置;
设置单元,用于在所述二进制文件被加载到内存但未被执行时,根据所述函数的位置为所述二进制文件加载到内存中的映像设置调试点;
处理单元,用于根据所述调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息;
转换单元,用于利用所述符号表将所述代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。
一种通信系统,包括本发明实施例提供的任一种代码覆盖测试装置。
本发明实施例采用获取源代码编译后产生的二进制文件和符号表,并根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,然后在该二进制文件被加载到内存但未被执行时,根据函数的位置为该二进制文件加载到内存中的映像设置调试点,根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息,最后利用符号表将该代码基本块的相关信息转换成代码行信息,从而获得测试所覆盖的代码行。由于该方案只在二进制文件加载到内存中的映像设置调试点,并不对二进制文件本身作实质性改动,因此,可以保证实际发布运行的代码编译出的二进制文件和测试所用的二进制文件是同一个文件,大大提高了测试的可靠性,而且,由于设置的是调试点,所以对代码运行的实质影响也极小。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的代码覆盖测试方法的流程图;
图2本发明实施例提供的代码覆盖测试方法的另一流程图;
图3是本发明实施例提供的代码覆盖测试装置的结构示意图;
图4是本发明实施例提供的终端的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供一种代码覆盖测试方法、装置和系统。以下分别进行详细说明。
实施例一、
本发明实施例将从代码覆盖测试装置的角度进行描述,该代码覆盖测试装置具体可以集成在终端中,该终端具体可以为智能手机、平板电脑、电子书阅读器、MP3播放器(Moving Picture Experts Group Audio Layer III,动态影像专家压缩标准音频层面3)、MP4(Moving Picture Experts Group Audio Layer IV,动态影像专家压缩标准音频层面3)播放器、膝上型便携计算机和台式计算机等等。
一种代码覆盖测试方法,包括:获取源代码编译后产生的二进制文件和符号表,根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,在该二进制文件被加载到内存但未被执行时,根据函数的位置为该二进制文件加载到内存中的映像设置调试点,根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息;利用符号表将该代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。
如图1所示,具体流程可以如下:
101、获取源代码编译后产生的二进制文件和符号表。
其中,该二进制文件和符号表可以由编译器对需要进行测试的源代码进行编译后得到,即其中,二进制文件指的是源代码编译以后得到的二进制可执行文件。
102、根据步骤101获取到的符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,其中,该函数的位置指的是函数在编译之后的实际位置。
103、在二进制文件被加载到内存但未被执行时,根据函数的位置为二进制文件加载到内存中的映像设置调试点。
例如,具体可以根据函数的位置,在二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令。即在每个跳转点上设置调试点,比如在每个跳转点上插入一条调试中断指令。
此时,保存该位置上原有的内容,以便后续可以恢复原样。
104、根据调试点确定执行过的代码基本块,并在内存中,比如不分页内存中记录执行过的代码基本块的相关信息。例如,具体可以如下:
在调试中断,且确定该中断是因调试点(即本发明实施例所设置的调试点)的设置而产生时,对引起该中断的调试点的后面的代码进行指令解码,直至发现跳转点(即发现引起该中断的调试点的后面的第一个跳转点);将引起该中断的调试点与该跳转点之间的代码作为执行过的一个代码基本块,将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中。
其中,解码是指将代码中的信息解析出来,而基本块信息表指的是用于保存该二进制文件中各个代码基本块的相关系信息的一个全局表,一般的,基本块信息表只记录已经执行过的代码基本块,但是,为了显示得更为清楚,在该基本块信息表中,还可以标识这些代码基本块是否已执行(这里指解码)过。该基本块信息表保存在内存中。
需说明的是,在应用于内核测试时,可以保存于锁定的不可分页交换内存中,即步骤“将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中”可以包括:
将执行过的代码基本块的相关信息记录在在不分页内存中的基本块信息表中。
比如,若在步骤103中,已经根据函数的位置,在二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令;则此时,步骤“在调试中断,且确定该中断是因调试点的设置而产生时,对引起所述中断的调试点的后面的代码进行指令解码,直至发现跳转点”具体可以包括:
在调试中断,且确定该中断是因插入的调试中断指令而产生时,对引起该中断的调试中断指令的后面的代码进行指令解码,直至发现跳转指令。
其中,若该跳转指令是解码得到的,则在发现该跳转指令之后,还可以确定该跳转指令是直接跳转指令还是间接跳转指令,然后进行不同的处理,比如,具体可以如下:
若该跳转指令为直接跳转指令,则在确定该基本块信息表中不存在以该跳转指令的跳转目的为开始地址的代码基本块时,在该跳转指令所对应的函数的开头位置插入一条调试中断指令,即进行如步骤103一样的处理。
而若该跳转指令为间接跳转指令,则将该跳转指令替换为一条调试中断指令。
其中,直接跳转指令,指的是可以根据指令的当前地址,和指令中可直接解码的信息,即可计算出跳转的目标地址的指令,也就是说,该目标地址是固定不变的。而间接跳转指令,指的是跳转的目标地址依赖于系统状态,比如依赖某个寄存器的值和/或某个内存中的值的指令,等等,因而在解码的时候,无法即刻计算出跳转的目标地址,而是需要等待确定了系统的状态后,才能获知跳转的目标地址。
由于对于间接跳转指令,是无法计算出跳转的目标地址的,即无法了解下一个代码基本块的位置,因此,本发明实施例采用的方法是:将该间接跳转指令本身替换成一条调试中断指令。这样,当调试中断再次发生,检查发生的地址,发现原本是一条间接跳转指令的时候,由于此时已经可以获知系统运行到该跳转指令上时的全部系统状态,比如每个寄存器的值和/或内存单元的值,等等,因此,就可以计算出跳转的目标地址,通过该跳转的目标地址即可知道下一个代码基本块的位置了。
此外,在将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中之后,还可以将代码恢复为原来的样子,比如删除该插入的调试中断指令,重新替换为原有指令。这样,下次执行到这个代码基本块就不会再发生调试中断了。当这个代码基本块被恢复之后,系统跳到该代码基本块的开始地址正常执行。也就是说,在步骤“将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中”之后,该方法还可以包括:
删除该插入的调试中断指令。
需说明的是,以上操作都是中断处理的一部分,但并不一定要在中断处理例程(interrupt handler)中执行。部分复杂耗时的工作,在中断处理例程中无法完成的,亦可在中断处理返回后执行,执行结束后再返回中断发生处继续执行,在此不再赘述。
105、利用该符号表将该代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。
其中,代码基本块的相关信息可以包括代码基本块的开始地址和结束地址等信息,即步骤“利用该符号表将该代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行”可以包括:
利用该符号表将该代码基本块的开始地址和结束地址转换成代码行信息,以获得测试所覆盖的代码行。
由上可知,本实施例采用获取源代码编译后产生的二进制文件和符号表,并根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,然后在该二进制文件被加载到内存但未被执行时,根据函数的位置为该二进制文件加载到内存中的映像设置调试点,根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息,最后利用符号表将该代码基本块的相关信息转换成代码行信息,从而获得测试所覆盖的代码行。由于该方案只在二进制文件加载到内存中的映像设置调试点,并不对二进制文件本身作实质性改动,因此,可以保证实际发布运行的代码编译出的二进制文件和测试所用的二进制文件是同一个文件,大大提高了测试的可靠性,而且,由于设置的是调试点,所以对代码运行的实质影响也极小。
此外,由于现有技术都是以直接写某个文件的方法来记录代码的覆盖信息的,但是,在操作系统内核程序(比如Windows系统或者Linux系统的驱动程序)中,并不是所有的场合都可以读写文件。此外,读写文件本身也是一种对系统的调用操作,会引起驱动程序本身的行为变得不同,因此,现有的这两种方案往往对驱动程序并不适用,在实际测试时容易导致系统蓝屏和死机。而该方案并不依赖文件操作来记录代码的覆盖程度,而是采用在内存中进行记录,必要时采用不可分页交换内存,由于操作不可分页内存是极为安全的操作,几乎在系统运行的所有场合下均可进行,因此对系统影响极小,可适用于驱动程序,避免因为测试导致的系统蓝屏和死机情况。
实施例二、
根据实施例一所描述的方法,以下将举例作进一步详细说明。
如图2所示,一种代码覆盖测试方法,具体流程可以如下:
201、代码覆盖测试装置获取源代码编译后产生的二进制文件和符号表。
其中,该二进制文件和符号表可以由编译器对需要进行测试的源代码进行编译后得到。
202、代码覆盖测试装置根据获取到的符号表对二进制文件进行解析,以确定二进制文件中每个源代码所定义的函数的位置。
其中,该函数的位置指的是函数在编译之后的实际位置。
203、代码覆盖测试装置监控每个二进制文件在操作系统中的加载,在二进制文件被加载到内存但未被执行时,根据函数的位置,在二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令。
此时,可以保存该位置上原有的内容,以便后续可以恢复原样。
204、在调试中断发生时,代码覆盖测试装置确定该中断是否因插入的调试中断指令而产生的,若是因插入的调试中断指令而产生的,则对引起该中断的调试中断指令的后面的代码进行指令解码,直至发现跳转指令(此时等于发现了另一个代码基本块,该跳转指令的地址为该另一个代码基本块的开始地址)。
其中,若该跳转指令是解码得到的,则在发现该跳转指令之后,还可以确定该跳转指令是直接跳转指令还是间接跳转指令,然后进行不同的处理,比如,具体可以如下:
若该跳转指令为直接跳转指令,则确定该基本块信息表中是否存在以该跳转指令的跳转目的为开始地址的代码基本块,若已经存在,则表明该代码基本块已经被执行过,因此不作处理,而若不存在,则表明该代码基本块还没有被执行过,因此可以在该跳转指令所对应的函数的开头位置插入一条调试中断指令,即进行如步骤203一样的处理,此后的处理也如同其他插入的调试中断指令。
而若该跳转指令为间接跳转指令,则无法确定其跳转目的。此时直接将该跳转指令替换为一条调试中断指令,此后的处理也如同其他插入的调试中断指令。待调试中断真实发生时,获得了系统的状态后,计算出跳转目的,再如同直接跳转指令一样的方式处理。
此外,若该中断不是因插入的调试中断指令而产生的,则按照现在的处理流程进行处理。
205、代码覆盖测试装置将引起该中断的调试点与该跳转点之间的代码作为执行过的一个代码基本块,并将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中,比如记录在不分页内存中的基本块信息表中,并标记为已经执行。
其中,基本块信息表指的是用于保存该二进制文件中各个代码基本块的相关系信息的一个全局表,其中,代码基本块的相关信息可以包括代码基本块的开始地址和结束地址等信息。在该基本块信息表中,还可以标识这些代码基本块是否已执行过。该基本块信息表保存在内存中。
此外,在将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中,还可以将代码恢复为原来的样子,比如删除该插入的调试中断指令,这样,下次执行到这个代码基本块就不会再发生调试中断了。当这个代码基本块被恢复之后,系统跳到该代码基本块的开始地址正常执行。
需说明的是,步骤204和205的操作都是中断处理的一部分,但并不一定要在中断处理例程中执行。部分复杂耗时的工作,在中断处理例程中无法完成的,亦可在中断处理返回后执行,执行结束后再返回中断发生处继续执行,在此不再赘述。
206、最终在测试的过程中,形成了一个基本块信息表。当测试人员结束测试,需要获得测试报告的时候,代码覆盖测试装置即可输出该基本块信息表,利用之前获取到的符号表将该基本块信息表中代码基本块的相关信息转换成代码行信息,这样,就可以获得测试所覆盖的代码行。
由上可知,本实施例采用获取源代码编译后产生的二进制文件和符号表,并根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,然后在该二进制文件被加载到内存但未被执行时,根据函数的位置在该二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令,根据该调试中断指令确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息,最后利用符号表将该代码基本块的相关信息转换成代码行信息,从而获得测试所覆盖的代码行。由于该方案只在二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令,并不对二进制文件本身作实质性改动,因此,可以保证实际发布运行的代码的二进制文件和测试所用的二进制文件是同一个文件,大大提高了测试的可靠性,而且,由于插入的是一条调试中断指令,所以对代码运行的实质影响也极小。
此外,该方案并不依赖文件操作来记录代码的覆盖程度,而是采用在内存中进行记录,必要时采用不可分页交换内存,由于操作不可分页内存是极为安全的操作,几乎在系统运行的所有场合均可进行,因此对系统影响极小,可适用于驱动程序,避免因为测试导致的系统蓝屏和死机情况。
实施例三、
根据实施例一和二所描述的方法,以下将以在微软(Windows)系统下,对Windows驱动程序进行测试为例进行说明。应当理解的是,本发明实施例同样可以适用于其他的硬件平台、其他操作系统和其他程序,在此不再赘述。
在本发明例中,该代码覆盖测试装置可以包括驱动部分模块和一个用户态的控制台命令行工具模块,简称命令行工具模块。其中,驱动部分模块可以安装到测试机上,而命令行工具模块则可以直接拷贝到测试机上。其中,这两个模块的功能具体可以如下:
(1)驱动部分模块可以完成以下的功能:
在Windows内核中,用户可以指定一个被测试驱动的二进制文件及该被测试驱动的函数入口地址列表(即符号表)给该驱动部分模块。如果没有指定,则该驱动部分模块不作任何处理。
一旦指定了要测试的驱动程序的二进制文件,该驱动部分模块就会监控该要测试的驱动程序的二进制文件(以下称为被测驱动程序)的加载。若发现被测驱动程序的加载,则该驱动部分模块就会修改被测驱动程序在内核中的映像,将所有的函数入口替换成一条int3指令,其中,该int3指令为x86硬件平台下的调试指令,机器编码为0xcc,该int3指令会引起调试中断。
由于该驱动部分模块已经接管了Windows系统中的调试中断,所以一旦发生调试中断,该驱动部分模块就首先得到执行,并确定该中断是否因插入的int3指令而产生的,若是因插入的int3指令而产生的,则对引起该中断的int3指令的后面的代码进行指令解码,直至发现跳转指令,并在找到跳转指令的时候,将跳转目的地址上的指令也替换成int3指令,然后将前一处的int3指令恢复成原来的代码,让系统继续运行。其中,对于直接跳转指令和间接跳转指令,其处理方法会有所不同,详见前面实施例,在此不再赘述。
由于后面新加入的int3指令会继续引起中断发生,所以会这样不断地执行下去,而该驱动部分模块也会记录下每次执行的开始位置和结束(跳转离开)的位置,即可得到每个代码基本块的开始地址和结束地址(即代码基本块的相关信息),于是,将这些代码基本块的相关信息记录在在不可分页内存中的基本块信息表中。
(2)命令行工具模块完成以下的功能:
该命令行工具模块可以获取需要测试的驱动程序的二进制文件(以下称为被测驱动程序)及其符号表,并可以根据获取到的符号表对被测驱动程序进行解析,从而确定被测驱动程序中每个源代码所定义的函数的位置,并将这些函数的位置传输给驱动部分模块。
在测试结束之后,可以通过该命令行工具模块将该基本块信息表中代码基本块的相关信息转换成代码行信息,这样,就可以获得测试所覆盖的代码行。
需说明的是,以上仅仅只是本发明实施例的一个范例,应当理解的是,具体实施时,还可以采用多种方式,比如采用更多的展示方式来展示测试结果,等等,在此不再赘述。
由上可知,本实施例采用获取被测驱动程序和符号表,并根据该符号表对该被测驱动程序进行解析,以确定每个源代码所定义的函数的位置,然后在该二进制文件被加载到内存但未被执行时,根据函数的位置在被测驱动程序加载到内存中的映像中的每个函数的开头位置插入一条int3指令,根据该int3指令确定执行过的代码基本块,并在不可分页内存中记录执行过的代码基本块的相关信息,最后利用符号表将该代码基本块的相关信息转换成代码行信息,从而获得测试所覆盖的代码行。由于该方案只在被测驱动程序加载到内存中的映像中的每个函数的开头位置插入一条int3指令,并不对被测驱动程序本身作实质性改动,因此,可以保证实际发布运行的驱动程序和被测驱动程序是同一个文件,大大提高了测试的可靠性,而且,由于插入的是一条int3指令,所以对代码的实质影响也极小;此外,该方案并不依赖文件操作来记录代码的覆盖程度,而是采用在不可分页内存中进行记录,由于操作不可分页内存是极为安全的操作,几乎在系统运行的所有场合均可进行,因此对系统影响极小,可适用于驱动程序,避免因为测试导致的系统蓝屏和死机情况。
实施例四、
相应的,本发明实施例还提供一种代码覆盖测试装置,如图3所示,该代码覆盖测试装置可以包括获取单元301、解析单元302、设置单元303、处理单元304和转换单元305。
获取单元301,用于获取源代码编译后产生的二进制文件和符号表;
其中,该二进制文件和符号表可以由编译器对需要进行测试的源代码进行编译后得到。
解析单元302,用于根据该符号表对所述二进制文件进行解析,以确定每个源代码所定义的函数的位置;
设置单元303,用于在该二进制文件被加载到内存但未被执行时,根据该函数的位置为所述二进制文件加载到内存中的映像设置调试点;
处理单元304,用于根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息;
比如,具体可以在不可分页内存中记录执行过的代码基本块的相关信息。
转换单元305,用于利用该符号表将该代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。
其中,代码基本块的相关信息可以包括代码基本块的开始地址和结束地址等信息,即:
转换单元305,具体可以用于利用该符号表将该代码基本块的开始地址和结束地址转换成代码行信息,以获得测试所覆盖的代码行。
可选的,其中,处理单元304可以包括测试子单元和记录子单元;
测试子单元,用于在调试中断,且确定该中断是因调试点(即设置单元303所设置的调试点)的设置而产生时,对引起该中断的调试点的后面的代码进行指令解码,直至发现跳转点(即发现引起该中断的调试点的后面的第一个跳转点);
记录子单元,用于将引起该中断的调试点与该跳转点之间的代码作为执行过的一个代码基本块,将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中。比如,具体可以将执行过的代码基本块的相关信息记录在在不可分页内存中的基本块信息表中。
其中,解码是指将代码中的信息解析出来,而基本块信息表指的是用于保存该二进制文件中各个代码基本块的相关系信息的一个全局表,一般的,基本块信息表只记录已经执行过的代码基本块,但是,为了显示得更为清楚,在该基本块信息表中,还可以标识这些代码基本块是否已执行过。该基本块信息表保存在内存中。
例如,设置单元302,具体可以用于根据该函数的位置,在该二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令;
则此时,测试子单元,具体可以用于在调试中断,且确定该中断是因插入的调试中断指令而产生时,对引起该中断的调试中断指令的后面的代码进行指令解码,直至发现跳转指令。
其中,若该跳转指令是解码得到的,则在发现该跳转指令之后,还可以确定该跳转指令是直接跳转指令还是间接跳转指令,然后进行不同的处理,比如,具体可以如下:
设置单元302,还可以用于在确定该跳转指令为解码得到的时,确定该跳转指令为直接跳转指令还是间接跳转指令,若为直接跳转指令,则在确定该基本块信息表中不存在以该跳转指令的跳转目的为开始地址的代码基本块时,在该跳转指令所对应的函数的开头位置插入一条调试中断指令;若为接跳转指令,则将该跳转指令替换为一条调试中断指令。
此外,在将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中之后,还可以将代码恢复为原来的样子,比如删除该插入的调试中断指令,这样,下次执行到这个代码基本块就不会再发生调试中断了。当这个代码基本块被恢复之后,系统跳到该代码基本块的开始地址正常执行。即处理单元304还可以包括删除子单元;
删除子单元,用于删除该插入的调试中断指令。
具体实施时,以上各个单元可以作为独立的实体来实现,也可以进行任意组合,作为同一或若干个实体来实现,比如,通过实施例三中的驱动部分模块和命令行工具模块来实现,等等,以上各个单元的实施,具体可参见前面的实施例,在此不再赘述。
该代码覆盖测试装置具体可以集成在终端中,该终端具体可以为智能手机、平板电脑、电子书阅读器、MP3播放器、MP4播放器、膝上型便携计算机和台式计算机等等。
由上可知,本实施例的代码覆盖测试装置的获取单元301可以获取源代码编译后产生的二进制文件和符号表,并由解析单元302根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,然后在该二进制文件被加载到内存但未被执行时,由设置单元303根据函数的位置为该二进制文件加载到内存中的映像设置调试点,并由处理单元304根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息,最后由转换单元305利用符号表将该代码基本块的相关信息转换成代码行信息,从而获得测试所覆盖的代码行。由于该方案只在二进制文件加载到内存中的映像设置调试点,并不对二进制文件本身作实质性改动,因此,可以保证实际发布运行的代码编译后产生的二进制文件和测试所用的二进制文件是同一个文件,大大提高了测试的可靠性,而且,由于设置的是调试点,所以对代码运行的实质影响也极小。
此外,该方案并不依赖文件操作来记录代码的覆盖程度,而是采用在内存中进行记录,必要时采用不可分页交换内存,由于操作不可分页内存是极为安全的操作,几乎在系统运行的所有场合均可进行,因此对系统影响极小,可适用于驱动程序,避免因为测试导致的系统蓝屏和死机情况。
实施例五、
相应的,本发明实施例还提供一种通信系统,包括本发明实施例提供的任一种代码覆盖测试装置,该代码覆盖测试装置具体可参见实施例四,例如,具体可以如下:
代码覆盖测试装置,用于获取源代码编译后产生的二进制文件和符号表,根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,在该二进制文件被加载到内存但未被执行时,根据函数的位置为该二进制文件加载到内存中的映像设置调试点,根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息;利用符号表将该代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行,具体可参见前面的实施例,在此不再赘述。
该代码覆盖测试装置具体可以集成在终端中,该终端具体可以为智能手机、平板电脑、电子书阅读器、MP3播放器、MP4播放器、膝上型便携计算机和台式计算机等等。
该通信系统可以实现本发明实施例所提供的浏览器页面数据过滤装置同样的有益效果,在此不再赘述。
实施例六、
相应的,本发明实施例还提供一种终端,如图4所示,该终端可以包括射频(RF,Radio Frequency)电路401、包括有一个或一个以上计算机可读存储介质的存储器402、输入单元403、显示单元404、传感器405、音频电路406、无线保真(WiFi,Wireless Fidelity)模块407、包括有一个或者一个以上处理核心的处理器408、以及电源409等部件。本领域技术人员可以理解,图4中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:
RF电路401可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,交由一个或者一个以上处理器408处理;另外,将涉及上行的数据发送给基站。通常,RF电路401包括但不限于天线、至少一个放大器、调谐器、一个或多个振荡器、用户身份模块(SIM,Subscriber IdentityModule)卡、收发信机、耦合器、低噪声放大器(LNA,Low Noise Amplifier)、双工器等。此外,RF电路401还可以通过无线通信与网络和其他设备通信。所述无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯系统(GSM,Global System of Mobile communication)、通用分组无线服务(GPRS,General Packet Radio Service)、码分多址(CDMA,Code Division MultipleAccess)、宽带码分多址(WCDMA,Wideband Code Division Multiple Access)、长期演进(LTE,Long Term Evolution)、电子邮件、短消息服务(SMS,ShortMessaging Service)等。
存储器402可用于存储软件程序以及模块,处理器408通过运行存储在存储器402的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器402可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据终端的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器402可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器402还可以包括存储器控制器,以提供处理器408和输入单元403对存储器402的访问。
输入单元403可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。具体地,在一个具体的实施例中,输入单元403可包括触敏表面以及其他输入设备。触敏表面,也称为触摸显示屏或者触控板,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触敏表面上或在触敏表面附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触敏表面可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器408,并能接收处理器408发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触敏表面。除了触敏表面,输入单元403还可以包括其他输入设备。具体地,其他输入设备可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元404可用于显示由用户输入的信息或提供给用户的信息以及终端的各种图形用户接口,这些图形用户接口可以由图形、文本、图标、视频和其任意组合来构成。显示单元404可包括显示面板,可选的,可以采用液晶显示器(LCD,Liquid Crystal Display)、有机发光二极管(OLED,OrganicLight-Emitting Diode)等形式来配置显示面板。进一步的,触敏表面可覆盖显示面板,当触敏表面检测到在其上或附近的触摸操作后,传送给处理器408以确定触摸事件的类型,随后处理器408根据触摸事件的类型在显示面板上提供相应的视觉输出。虽然在图4中,触敏表面与显示面板是作为两个独立的部件来实现输入和输入功能,但是在某些实施例中,可以将触敏表面与显示面板集成而实现输入和输出功能。
终端还可包括至少一种传感器405,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板的亮度,接近传感器可在终端移动到耳边时,关闭显示面板和/或背光。作为运动传感器的一种,重力加速度传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于终端还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
音频电路406、扬声器,传声器可提供用户与终端之间的音频接口。音频电路406可将接收到的音频数据转换后的电信号,传输到扬声器,由扬声器转换为声音信号输出;另一方面,传声器将收集的声音信号转换为电信号,由音频电路406接收后转换为音频数据,再将音频数据输出处理器408处理后,经RF电路401以发送给比如另一终端,或者将音频数据输出至存储器402以便进一步处理。音频电路406还可能包括耳塞插孔,以提供外设耳机与终端的通信。
WiFi属于短距离无线传输技术,终端通过WiFi模块407可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图4示出了WiFi模块407,但是可以理解的是,其并不属于终端的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
处理器408是终端的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器402内的软件程序和/或模块,以及调用存储在存储器402内的数据,执行终端的各种功能和处理数据,从而对手机进行整体监控。可选的,处理器408可包括一个或多个处理核心;优选的,处理器408可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器408中。
终端还包括给各个部件供电的电源409(比如电池),优选的,电源可以通过电源管理系统与处理器408逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源409还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
尽管未示出,终端还可以包括摄像头、蓝牙模块等,在此不再赘述。具体在本实施例中,终端中的处理器408会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器402中,并由处理器408来运行存储在存储器402中的应用程序,从而实现各种功能:
尽管未示出,终端还可以包括摄像头、蓝牙模块等,在此不再赘述。具体在本实施例中,终端的显示单元是触摸屏显示器,终端还包括有存储器,以及一个或者一个以上的程序,其中一个或者一个以上程序存储于存储器中,且经配置以由一个或者一个以上处理器执行述一个或者一个以上程序包含用于进行以下操作的指令:
获取源代码的二进制文件和符号表,根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,在该二进制文件被加载到内存但未被执行时,根据函数的位置为该二进制文件加载到内存中的映像设置调试点,根据该调试点确定执行过的代码基本块,并在内存(比如不可分页内存)中记录执行过的代码基本块的相关信息;利用符号表将该代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。
例如,其中,根据函数的位置为该二进制文件加载到内存中的映像设置调试点,具体可以如下:
根据函数的位置,在二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令。
此时,还可以保存该位置上原有的内容,以便后续可以恢复原样。
而步骤“根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息”则可以具体如下:
在调试中断,且确定该中断是因调试点的设置而产生时,对引起该中断的调试点的后面的代码进行指令解码,直至发现跳转点;将引起该中断的调试点与该跳转点之间的代码作为执行过的代码基本块,将执行过的代码基本块的相关信息记录在在内存(比如不可分页内存)中的基本块信息表中。其中,代码基本块的相关信息可以包括代码基本块的开始地址和结束地址等信息。
比如,若已经根据函数的位置,在二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令;则此时,具体可以在调试中断,且确定该中断是因插入的调试中断指令而产生时,对引起该中断的调试中断指令的后面的代码进行指令解码,直至发现跳转指令。
其中,若该跳转指令是解码得到的,则在发现该跳转指令之后,还可以确定该跳转指令是直接跳转指令还是间接跳转指令,然后进行不同的处理,比如,具体可以如下:
若该跳转指令为直接跳转指令,则在确定该基本块信息表中不存在以该跳转指令的跳转目的为开始地址的代码基本块时,在该跳转指令所对应的函数的开头位置插入一条调试中断指令,即进行如步骤103一样的处理。
而若该跳转指令为间接跳转指令,则将该跳转指令替换为一条调试中断指令。
此外,在将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中之后,还可以将代码恢复为原来的样子,比如删除该插入的调试中断指令,这样,下次执行到这个代码基本块就不会再发生调试中断了。即在步骤“将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中”之后,还可以包括:
删除该插入的调试中断指令。
以上实施方式具体可参见前面的实施例,在此不再赘述。
由上可知,本实施例的终端采用获取源代码编译后产生的二进制文件和符号表,并根据该符号表对二进制文件进行解析,以确定每个源代码所定义的函数的位置,然后在该二进制文件被加载到内存但未被执行时,根据函数的位置为该二进制文件加载到内存中的映像设置调试点,根据该调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息,最后利用符号表将该代码基本块的相关信息转换成代码行信息,从而获得测试所覆盖的代码行。由于该方案只在二进制文件加载到内存中的映像设置调试点,并不对二进制文件本身作实质性改动,因此,可以保证实际发布运行的代码编译后产生的二进制文件和测试所用的二进制文件是同一个文件,大大提高了测试的可靠性,而且,由于设置的是调试点,所以对代码运行的实质影响也极小。
此外,该方案并不依赖文件操作来记录代码的覆盖程度,而是采用在内存中进行记录,由于操作内存是极为安全的操作,必要时采用不可分页交换内存,几乎在系统运行的所有场合均可进行,因此对系统影响极小,可适用于驱动程序,避免因为测试导致的系统蓝屏和死机情况。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取记忆体(RAM,Random Access Memory)、磁盘或光盘等。
以上对本发明实施例所提供的一种代码覆盖测试方法、装置和系统进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (15)
1.一种代码覆盖测试方法,其特征在于,包括:
获取源代码编译后产生的二进制文件和符号表;
根据所述符号表对所述二进制文件进行解析,以确定每个源代码所定义的函数的位置;
在所述二进制文件被加载到内存但未被执行时,根据所述函数的位置为所述二进制文件加载到内存中的映像设置调试点;
根据所述调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息;
利用所述符号表将所述代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。
2.根据权利要求1所述的方法,其特征在于,所述根据所述调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息,包括:
在调试中断,且确定所述中断是因所述调试点的设置而产生时,对引起所述中断的调试点的后面的代码进行指令解码,直至发现跳转点;
将引起所述中断的调试点与所述跳转点之间的代码作为一个执行过的代码基本块,将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中。
3.根据权利要求1所述的方法,其特征在于,所述将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中,包括:
将执行过的代码基本块的相关信息记录在在不分页内存中的基本块信息表中。
4.根据权利要求2或3所述的方法,其特征在于,
所述根据所述函数的位置为所述二进制文件加载到内存中的映像设置调试点,包括:根据所述函数的位置,在所述二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令;
所述在调试中断,且确定所述中断是因所述调试点的设置而产生时,对引起所述中断的调试点的后面的代码进行指令解码,直至发现跳转点,包括:在调试中断,且确定所述中断是因插入的调试中断指令而产生时,对引起所述中断的调试中断指令的后面的代码进行指令解码,直至发现跳转指令。
5.根据权利要求4所述的方法,其特征在于,若所述跳转指令为解码得到的,则所述发现跳转指令之后,还包括:
若所述跳转指令为直接跳转指令,则在确定所述基本块信息表中不存在以所述跳转指令的跳转目的为开始地址的代码基本块时,在所述跳转指令所对应的跳转目的位置插入一条调试中断指令;
若所述跳转指令为间接跳转指令,则将所述跳转指令替换为一条调试中断指令。
6.根据权利要求4所述的方法,其特征在于,所述将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中之后,还包括:
删除所述插入的调试中断指令。
7.根据权利要求1至3任一项所述的方法,其特征在于,所述代码基本块的相关信息包括代码基本块的开始地址和结束地址,则所述利用所述符号表将所述代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行,包括:
利用所述符号表将所述代码基本块的开始地址和结束地址转换成代码行信息,以获得测试所覆盖的代码行。
8.一种代码覆盖测试装置,其特征在于,包括:
获取单元,用于获取源代码编译后产生的二进制文件和符号表;
解析单元,用于根据所述符号表对所述二进制文件进行解析,以确定每个源代码所定义的函数的位置;
设置单元,用于在所述二进制文件被加载到内存但未被执行时,根据所述函数的位置为所述二进制文件加载到内存中的映像设置调试点;
处理单元,用于根据所述调试点确定执行过的代码基本块,并在内存中记录执行过的代码基本块的相关信息;
转换单元,用于利用所述符号表将所述代码基本块的相关信息转换成代码行信息,以获得测试所覆盖的代码行。
9.根据权利要求8所述的代码覆盖测试装置,其特征在于,所述处理单元包括测试子单元和记录子单元;
测试子单元,用于在调试中断,且确定所述中断是因所述调试点的设置而产生时,对引起所述中断的调试点的后面的代码进行指令解码,直至发现跳转点;
记录子单元,用于将引起所述中断的调试点与所述跳转点之间的代码作为执行过的一个代码基本块,将执行过的代码基本块的相关信息记录在在内存中的基本块信息表中。
10.根据权利要求9所述的代码覆盖测试装置,其特征在于,
所述记录子单元,具体用于将引起所述中断的调试点与所述跳转点之间的代码作为执行过的一个代码基本块,将执行过的代码基本块的相关信息记录在在不分页内存中的基本块信息表中。
11.根据权利要求9或10所述的代码覆盖测试装置,其特征在于,
所述设置单元,具体用于根据所述函数的位置,在所述二进制文件加载到内存中的映像中的每个函数的开头位置插入一条调试中断指令;
所述测试子单元,具体用于在调试中断,且确定所述中断是因插入的调试中断指令而产生时,对引起所述中断的调试中断指令的后面的代码进行指令解码,直至发现跳转指令。
12.根据权利要求11所述的代码覆盖测试装置,其特征在于,
所述设置单元,还用于在确定所述跳转指令为解码得到的时,确定所述跳转指令为直接跳转指令还是间接跳转指令,若为直接跳转指令,则在确定所述基本块信息表中不存在以所述跳转指令的跳转目的为开始地址的代码基本块时,在所述跳转指令所对应的跳转目的位置插入一条调试中断指令;若为间接跳转指令,将所述跳转指令替换为一条调试中断指令。
13.根据权利要求11所述的代码覆盖测试装置,其特征在于,所述处理单元还包括删除子单元;
删除子单元,用于删除所述插入的调试中断指令。
14.根据权利要求8至10任一项所述的代码覆盖测试装置,其特征在于,所述代码基本块的相关信息包括代码基本块的开始地址和结束地址,则:
所述转换单元,用于利用所述符号表将所述代码基本块的开始地址和结束地址转换成代码行信息,以获得测试所覆盖的代码行。
15.一种通信系统,其特征在于,包括权利要求8至14任一项所述的代码覆盖测试装置。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310143177.2A CN104123218B (zh) | 2013-04-23 | 2013-04-23 | 一种代码覆盖测试方法、装置和系统 |
PCT/CN2014/073758 WO2014173211A1 (en) | 2013-04-23 | 2014-03-20 | Code coverage testing method, device and system |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310143177.2A CN104123218B (zh) | 2013-04-23 | 2013-04-23 | 一种代码覆盖测试方法、装置和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104123218A true CN104123218A (zh) | 2014-10-29 |
CN104123218B CN104123218B (zh) | 2015-06-24 |
Family
ID=51768638
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310143177.2A Active CN104123218B (zh) | 2013-04-23 | 2013-04-23 | 一种代码覆盖测试方法、装置和系统 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN104123218B (zh) |
WO (1) | WO2014173211A1 (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104375941A (zh) * | 2014-12-11 | 2015-02-25 | 无锡江南计算技术研究所 | 可执行程序测试用例集二进制代码覆盖率自动化评估方法 |
CN107368313A (zh) * | 2017-07-18 | 2017-11-21 | 腾讯科技(深圳)有限公司 | 代码检测方法、装置及电子设备 |
CN108459879A (zh) * | 2018-01-17 | 2018-08-28 | 宇龙计算机通信科技(深圳)有限公司 | 一种防止终端死机的方法、终端 |
CN110334031A (zh) * | 2019-07-16 | 2019-10-15 | 腾讯科技(深圳)有限公司 | 内存分配代码检测方法、装置、计算机设备及存储介质 |
CN110515829A (zh) * | 2019-07-10 | 2019-11-29 | 平安普惠企业管理有限公司 | 应用测试方法、装置、设备及计算机可读存储介质 |
CN113176989A (zh) * | 2021-05-27 | 2021-07-27 | 北京字节跳动网络技术有限公司 | 日志文件的解析方法、装置、设备及存储介质 |
CN113312088A (zh) * | 2021-06-29 | 2021-08-27 | 北京熵核科技有限公司 | 一种程序指令的执行方法及装置 |
CN114595198A (zh) * | 2022-03-15 | 2022-06-07 | 北京字节跳动网络技术有限公司 | 崩溃解析方法、装置、电子设备及存储介质 |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109582574B (zh) * | 2018-11-27 | 2024-03-19 | 平安科技(深圳)有限公司 | 一种代码覆盖率统计方法、装置、存储介质及终端设备 |
CN112199272B (zh) * | 2020-09-08 | 2024-10-01 | 深圳市金锐显数码科技有限公司 | 一种智能终端的测试方法、装置、终端设备及介质 |
CN116795726B (zh) * | 2023-08-25 | 2023-11-28 | 麒麟软件有限公司 | 一种在线调试Linux内核的方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH10214204A (ja) * | 1997-01-29 | 1998-08-11 | Oki Electric Ind Co Ltd | デバッガー |
CN102236600A (zh) * | 2010-05-06 | 2011-11-09 | 无锡中星微电子有限公司 | 获得代码覆盖率的方法及装置 |
CN102521123A (zh) * | 2011-11-24 | 2012-06-27 | 西安邮电学院 | 一种基于逻辑执行块的嵌入式软件测试插桩方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100388229C (zh) * | 2005-06-01 | 2008-05-14 | 中兴通讯股份有限公司 | 一种自动生成桩函数和驱动函数的单元测试系统及方法 |
CN100487667C (zh) * | 2005-12-14 | 2009-05-13 | 中兴通讯股份有限公司 | 一种软件单元测试自动化系统及其方法 |
CN101661425B (zh) * | 2008-08-26 | 2012-03-21 | 国际商业机器公司 | 测试覆盖分析方法和装置 |
-
2013
- 2013-04-23 CN CN201310143177.2A patent/CN104123218B/zh active Active
-
2014
- 2014-03-20 WO PCT/CN2014/073758 patent/WO2014173211A1/en active Application Filing
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH10214204A (ja) * | 1997-01-29 | 1998-08-11 | Oki Electric Ind Co Ltd | デバッガー |
CN102236600A (zh) * | 2010-05-06 | 2011-11-09 | 无锡中星微电子有限公司 | 获得代码覆盖率的方法及装置 |
CN102521123A (zh) * | 2011-11-24 | 2012-06-27 | 西安邮电学院 | 一种基于逻辑执行块的嵌入式软件测试插桩方法 |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104375941A (zh) * | 2014-12-11 | 2015-02-25 | 无锡江南计算技术研究所 | 可执行程序测试用例集二进制代码覆盖率自动化评估方法 |
CN104375941B (zh) * | 2014-12-11 | 2017-09-22 | 无锡江南计算技术研究所 | 可执行程序测试用例集二进制代码覆盖率自动化评估方法 |
CN107368313A (zh) * | 2017-07-18 | 2017-11-21 | 腾讯科技(深圳)有限公司 | 代码检测方法、装置及电子设备 |
CN108459879A (zh) * | 2018-01-17 | 2018-08-28 | 宇龙计算机通信科技(深圳)有限公司 | 一种防止终端死机的方法、终端 |
CN110515829A (zh) * | 2019-07-10 | 2019-11-29 | 平安普惠企业管理有限公司 | 应用测试方法、装置、设备及计算机可读存储介质 |
CN110334031A (zh) * | 2019-07-16 | 2019-10-15 | 腾讯科技(深圳)有限公司 | 内存分配代码检测方法、装置、计算机设备及存储介质 |
CN110334031B (zh) * | 2019-07-16 | 2023-11-03 | 腾讯科技(深圳)有限公司 | 内存分配代码检测方法、装置、计算机设备及存储介质 |
CN113176989A (zh) * | 2021-05-27 | 2021-07-27 | 北京字节跳动网络技术有限公司 | 日志文件的解析方法、装置、设备及存储介质 |
CN113176989B (zh) * | 2021-05-27 | 2024-07-09 | 北京字节跳动网络技术有限公司 | 日志文件的解析方法、装置、设备及存储介质 |
CN113312088A (zh) * | 2021-06-29 | 2021-08-27 | 北京熵核科技有限公司 | 一种程序指令的执行方法及装置 |
CN114595198A (zh) * | 2022-03-15 | 2022-06-07 | 北京字节跳动网络技术有限公司 | 崩溃解析方法、装置、电子设备及存储介质 |
CN114595198B (zh) * | 2022-03-15 | 2023-09-05 | 抖音视界有限公司 | 崩溃解析方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
WO2014173211A1 (en) | 2014-10-30 |
CN104123218B (zh) | 2015-06-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104123218B (zh) | 一种代码覆盖测试方法、装置和系统 | |
CN108415739B (zh) | 一种动态链接库函数的钩挂方法、装置和存储介质 | |
KR101665835B1 (ko) | 전자장치, 배터리 보호방법, 장치, 프로그램 및 기록매체 | |
CN105404585A (zh) | 获取代码覆盖率的方法及装置 | |
CN105320598A (zh) | 软件测试方法及装置 | |
CN106502703B (zh) | 一种函数调用方法和装置 | |
CN104572430A (zh) | 一种终端应用界面的测试方法、装置和系统 | |
CN103164322A (zh) | 一种程序崩溃的签名方法和装置 | |
CN110196795B (zh) | 检测移动终端应用运行状态的方法及相关装置 | |
CN103473163A (zh) | 应用程序检测方法及装置 | |
CN104636047A (zh) | 对列表中的对象进行操作的方法、装置及触屏终端 | |
CN104298587A (zh) | 一种代码覆盖测试方法、装置和系统 | |
CN104077211A (zh) | 一种移动终端软件的测试方法及测试系统 | |
CN104869465A (zh) | 视频播放控制方法和装置 | |
CN104077184A (zh) | 一种应用程序的进程控制方法及计算机系统 | |
CN104346276A (zh) | 软件测试的方法及装置 | |
CN103631625A (zh) | 一种数据获取的方法、用户端、服务器及系统 | |
CN103617164A (zh) | 网页预取方法、装置及终端设备 | |
CN105278925A (zh) | 对卸载的软件进行垃圾清除的方法及装置 | |
CN106445719A (zh) | 恢复模式Recovery指令读写方法及装置 | |
CN106708555B (zh) | 一种加载插件的方法和装置 | |
CN109145598B (zh) | 脚本文件的病毒检测方法、装置、终端及存储介质 | |
CN103530057A (zh) | 一种字符的输入方法、装置及终端设备 | |
CN103544457A (zh) | 一种近场通信标签的识别方法、装置、和移动终端 | |
CN104123210A (zh) | 测试浏览器性能的方法、设备和系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |