CN114443461A - 一种代码覆盖信息确定方法、装置、系统及介质 - Google Patents

一种代码覆盖信息确定方法、装置、系统及介质 Download PDF

Info

Publication number
CN114443461A
CN114443461A CN202011230626.3A CN202011230626A CN114443461A CN 114443461 A CN114443461 A CN 114443461A CN 202011230626 A CN202011230626 A CN 202011230626A CN 114443461 A CN114443461 A CN 114443461A
Authority
CN
China
Prior art keywords
code
target
information
symbol table
code block
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.)
Pending
Application number
CN202011230626.3A
Other languages
English (en)
Inventor
宾涛
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN202011230626.3A priority Critical patent/CN114443461A/zh
Publication of CN114443461A publication Critical patent/CN114443461A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3676Test 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)
  • Stored Programmes (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种代码覆盖信息确定方法、装置、系统及介质,所述方法包括:获取目标代码块地址,所述目标代码块地址是目标代码测试过程中基于探针函数得到的;确定所述目标代码块地址对应的目标符号表,所述目标符号表中记录有所述目标代码所对应的源代码在编译阶段涉及的映射信息;利用所述目标符号表解析所述目标代码块地址,得到目标代码块的首行信息;根据所述首行信息和预存的关联关系表确定所述目标代码块的目标块内代码行信息,以及将所述目标块内代码行信息作为覆盖代码行信息,所述关联关系表记录代码块和对应的块内代码行之间的关联关系。本申请可以提高确定覆盖代码行信息的确定效率,保证后续代码覆盖率计算的实时性。

Description

一种代码覆盖信息确定方法、装置、系统及介质
技术领域
本申请涉及互联网通信技术领域,尤其涉及一种代码覆盖信息确定方法、装置、系统及介质。
背景技术
代码覆盖信息可以指示测试中所运行的代码,可以指示基于测试用例所覆盖的代码。基于代码覆盖信息可以得到目标代码被测试的比例和程度,进而可以有效评估测试是否充分。
相关技术中,常采用下述两种方式来确定代码覆盖信息:
1)通过llvm(底层虚拟机)pass(趟)在编译器底层进行代码行的覆盖统计,这样可能需要对原有编译器进行更换,编译器更换往往存在许多未知的编译问题,同时更换后的编译器也需要随着相关开发工具(比如xcode;xcode:一种运行在操作系统Mac OS X上的集成开发工具;Mac OS X:苹果公司为苹果电脑系列产品开发的专属操作系统)的升级而更新。因此存在较高的接入成本和(因报错、更新产生的)维护成本,这样导致搭建用于确定代码覆盖信息的计算环境的复杂度较高,进而影响着确定代码覆盖信息的效率;
2)采用gcov(一种代码测试工具)的方案:将编译阶段所生成的gcno文件(一种代码结构文件)和运行阶段所生成的gcda文件(一种代码执行文件)通过lcov(一种解析工具,可以输出代码统计数据)来得到代码覆盖信息。该方案效率较低,缺乏得到代码覆盖信息的时效性。同时,该方案存在崩溃(crash)风险以及转储(dump)数据丢失问题。
因此,需要提供快速且有效的代码覆盖信息确定方案。
发明内容
为了解决现有技术应用在确定代码覆盖信息时,效率低等问题,本申请提供了一种代码覆盖信息确定方法、装置、系统及介质:
根据本申请的第一方面,提供了一种代码覆盖信息确定方法,所述方法包括:
获取目标代码块地址,所述目标代码块地址是目标代码测试过程中基于探针函数得到的;
确定所述目标代码块地址对应的目标符号表,所述目标符号表中记录有所述目标代码所对应的源代码在编译阶段涉及的映射信息;
利用所述目标符号表解析所述目标代码块地址,得到目标代码块的首行信息;
根据所述首行信息和预存的关联关系表确定所述目标代码块的目标块内代码行信息,以及将所述目标块内代码行信息作为覆盖代码行信息,所述关联关系表记录代码块和对应的块内代码行之间的关联关系。
根据本申请的第二方面,提供了一种代码覆盖信息确定方法,所述方法包括:
客户端在测试目标代码过程中基于探针函数得到目标代码块地址;
所述客户端将所述目标代码块地址上报至服务端;
所述服务端确定所述目标代码块地址对应的目标符号表,所述目标符号表中记录有所述目标代码所对应的源代码在编译阶段涉及的映射信息;
所述服务端利用所述目标符号表解析所述目标代码块地址,得到目标代码块的首行信息;
所述服务端根据所述首行信息和预存的关联关系表确定所述目标代码块的目标块内代码行信息,以及将所述目标块内代码行信息作为覆盖代码行信息,所述关联关系表记录代码块和对应的块内代码行之间的关联关系。
根据本申请的第三方面,提供了一种代码覆盖信息确定装置,所述装置包括:
第一地址获取模块:用于获取目标代码块地址,所述目标代码块地址是目标代码测试过程中基于探针函数得到的;
第一符号表确定模块:用于确定所述目标代码块地址对应的目标符号表,所述目标符号表中记录有所述目标代码所对应的源代码在编译阶段涉及的映射信息;
第一解析模块:用于利用所述目标符号表解析所述目标代码块地址,得到目标代码块的首行信息;
第一覆盖代码行信息确定模块:用于根据所述首行信息和预存的关联关系表确定所述目标代码块的目标块内代码行信息,以及将所述目标块内代码行信息作为覆盖代码行信息,所述关联关系表记录代码块和对应的块内代码行之间的关联关系。
根据本申请的第四方面,提供了一种代码覆盖信息确定系统,所述装置包括:
客户端,所述客户端包括:第二地址获取模块:用于在测试目标代码过程中基于探针函数得到目标代码块地址;上报模块:用于将所述目标代码块地址上报至服务端;
以及所述服务端,所述服务端包括:第二符号表确定模块:用于确定所述目标代码块地址对应的目标符号表,所述目标符号表中记录有所述目标代码所对应的源代码在编译阶段涉及的映射信息;第二解析模块:用于利用所述目标符号表解析所述目标代码块地址,得到目标代码块的首行信息;第二覆盖代码行信息确定模块:用于根据所述首行信息和预存的关联关系表确定所述目标代码块的目标块内代码行信息,以及将所述目标块内代码行信息作为覆盖代码行信息,所述关联关系表记录代码块和对应的块内代码行之间的关联关系。
根据本申请的第五方面,提供了一种电子设备,所述电子设备包括处理器和存储器,所述存储器中存储有至少一条指令或至少一段程序,所述至少一条指令或所述至少一段程序由所述处理器加载并执行以实现如第一方面所述的代码覆盖信息确定方法或者第二方面所述的代码覆盖信息确定方法。
根据本申请的第六方面,提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令或至少一段程序,所述至少一条指令或所述至少一段程序由处理器加载并执行以实现如第一方面所述的代码覆盖信息确定方法或者第二方面所述的代码覆盖信息确定方法。
根据本申请的第七方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行第一方面所述的代码覆盖信息确定方法或者第二方面所述的代码覆盖信息确定方法。
本申请提供的一种代码覆盖信息确定方法、装置、系统及介质,具有如下技术效果:
本申请获取代码块地址,然后利用符号表得到代码块的首行信息,再根据首行信息和关联关系表确定覆盖代码行信息。本申请可以提高确定覆盖代码行信息的确定效率,保证后续代码覆盖率计算的实时性。本申请所提供的代码覆盖信息确定方案中计算环境搭建方便,进行编译器替换或者维护的需求小,能够大大降低相关的接入成本和维护成本。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案和优点,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它附图。
图1是本发明实施例提供的一种应用环境的示意图;
图2是本发明实施例提供的一种代码覆盖信息确定方法的流程示意图;
图3也是本发明实施例提供的一种代码覆盖信息确定方法的流程示意图;
图4是本发明实施例提供的利用目标符号表解析目标代码块地址得到目标代码块的首行信息的一种流程示意图;
图5是本发明实施例提供的得到代码覆盖率的一种流程示意图;
图6是本发明实施例提供的代码覆盖信息确定系统的一种架构涉及示意图;
图7也是本发明实施例提供的代码覆盖信息确定系统的一种架构设计示意图;
图8是本发明实施例提供的源代码示意图;
图9是本发明实施例提供的展示代码块-代码行对应关系的示意图;
图10也是本发明实施例提供的展示代码块-代码行对应关系的示意图
图11是本发明实施例提供的一种代码覆盖信息确定装置的组成框图;
图12是本发明实施例提供的一种电子设备的结构示意图;
图13-14是本发明实施例提供的编译器的一种配置界面图;
图15是本发明实施例提供的代码覆盖信息检测工具的一种配置界面图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或服务器不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
对本发明实施例进行进一步详细说明之前,对本发明实施例中涉及的名词和术语进行说明,本发明实施例中涉及的名词和术语适用于如下的解释。
代码覆盖率:代码覆盖(Code coverage)是程序测试中的一种度量指标,描述被测程序中代码被测试的比例和程度,所得比例称为代码覆盖率。
程序插桩:它是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针(本质上就是进行信息采集的代码段,可以是赋值语句或采集覆盖信息的函数调用),通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的方法。
Objective-C:它是一种通用、高级、面向对象的编程语言。
SanitizerCoverage:它是llvm(底层虚拟机)内置的一个简单的代码覆盖信息检测工具。它可以在函数级、基本块级和边缘级插入对用户定义函数的调用,提供这些回调的默认实现,以提高生成代码覆盖信息的便利性、实现代码覆盖信息的可视化。
gcc:它是由GNU(一个自由的操作系统,其内容软件完全以GPL方式发布)开发的编程语言编译器。它是以GPL(GUN通用公共许可证)及LGPL(GNU较宽松公共许可证)所发行的自由软件,也是GNU计划的关键部分,也是GNU工具链的主要组成部分之一。
请参阅图1,图1是本发明实施例提供的一种应用环境的示意图,该应用环境中可以包括客户端01和服务端02,客户端与服务器可以通过有线或无线通信方式进行直接或间接地连接。客户端将目标代码块地址上报给服务端,服务端利用目标符号表解析目标代码块地址,服务端根据地址解析结果和关联关系表确定目标代码块的目标块内代码行信息以得到覆盖代码行信息。需要说明的是,图1仅仅是一种示例。
客户端可以包括智能手机、台式电脑、平板电脑、笔记本电脑、增强现实(augmented reality,AR)/虚拟现实(virtual reality,VR)设备、数字助理、智能音箱、智能可穿戴设备等类型的实体设备,也可以包括运行于实体设备中的软体,比如计算机程序。该客户端所对应的操作系统可以包括安卓系统(Android系统)、IOS系统(是由苹果公司开发的移动操作系统)、linux(一种操作系统)、Microsoft Windows(微软视窗操作系统)等。
服务端可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云计算服务的云服务器。其中服务器可以包括有网络通信单元、处理器和存储器等等。服务端可以为客户端提供后台服务。
以下介绍本发明一种代码覆盖信息确定方法的具体实施例,图2是本发明实施例提供的一种代码覆盖信息确定方法的流程示意图,本说明书提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的劳动可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的系统或产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境)。具体的如图2所示,所述方法可以包括:
S201:获取目标代码块地址,所述目标代码块地址是目标代码测试过程中基于探针函数得到的;
在本发明实施例中,利用测试用例对目标代码进行测试,测试过程中基于探针函数得到的目标代码块地址可以指示当前运行的目标代码块。目标代码块地址可以指示目标代码块对应的当前CPU(中央处理器)所访问的内存或者寄存器的地址。
客户端或者服务端可以通过代码覆盖信息检测工具来获取目标代码块地址。在实际应用中,客户端可以将获取的目标代码块地址上报至服务端,进而由服务端执行后续步骤S202-S204以得到覆盖代码行信息。比如,当客户端所对应的操作系统为IOS系统且运行有xcode时,客户端可以打开SanitizerCoverage的开关,通过SanitizerCoverage获取目标代码块地址。客户端将目标代码块地址上报至服务端。其中SanitizerCoverage所对应的llvm集成于xcode中。当然,客户端也可以不向服务端上报目标代码块地址,由客户端继续执行后续步骤S202-S204以得到覆盖代码行信息。
在一个实施例中,所述获取目标代码块地址之前,所述方法还包括:获取所述源代码;利用编译器对所述源代码进行编译得到所述目标代码;向所述目标代码逐块注入探针函数。
客户端或者服务端利用编译器对源代码进行编译时,可以先打开允许注入探针函数的开关;然后基于配置信息对源代码进行编译以得到目标代码,配置信息中可以记载对源代码进行分块划分的设置信息;再者向目标代码逐块注入探针函数。编译器可以选用xcode。相应的,当进行目标代码测试时,通过对应探针函数的反馈确定目标代码中当前运行的目标代码块。利用探针函数可以方便对目标代码的执行进行有效定位。
S202:确定所述目标代码块地址对应的目标符号表,所述目标符号表中记录有所述目标代码所对应的源代码在编译阶段涉及的映射信息;
在本发明实施例中,当进行某一项目产品(比如app;app:应用程序)的开发时,常对该项目产品进行模块(类目对象)的划分,每个模块与一符号表一一对应。客户端或者服务端确定目标代码块地址对应的目标符号表,相当于确定目标代码所属的模块的对应符号表。符号表记录对应模块的由第一代码(对应编译前)转换至第二代码(对应编译后)过程所涉及的映射信息。符号表可以指示相关模块编译后,在编译生成的二进制文件.app的同级目录下生成的同名的.dSYM文件。符号表是内存地址与函数名、文件名、行号的映射表。符号表中的元素可参考下面所示:
<起始地址><结束地址><函数>[<文件名:行号>]。
这些元素也视作调试符号,因此符号表也视作对调试信息作了相关记录。
在一个实施例中,所述确定所述目标代码块地址对应的目标符号表,包括:首先,根据所述目标代码块地址中的基地址在预存的基地址集中确定目标基地址;然后,确定所述目标基地址所对应的目标类目对象,不同类目对象指示不同的代码集合,所述代码集合配置有对应的符号表;再者,将所述目标类目对象对应的符号表作为所述目标符号表。
目标代码块地址包括基地址和偏移地址。每个模块(类目对象)的基地址(起始地址)是不一样的,每个模块存在对应的地址区间。客户端或者服务端可以根据目标代码块地址中的基地址在预存的基地址集中确定目标基地址,也就是在预存的基地址集中确定出与目标代码块地址中的基地址相匹配的目标基地址。目标基地址确定后,也缩小了候选地址区间的范围。由于目标基地址与模块(类目对象)的对应关系,以及目标模块与符号表的对应关系,客户端或者服务端可以将目标模块对应的符号表作为目标符号表。利用基地址进行属于同一模块的代码集合的符号表的管理,可以提高目标符号表的确定效率。
S203:利用所述目标符号表解析所述目标代码块地址,得到目标代码块的首行信息;
在本发明实施例中,可以参考上述步骤S202中对于符号表的相关记载,这里不再赘述。结合目标符号表中的元素,客户端或者服务端解析目标代码块地址得到目标代码块的首行信息。该首行信息可以指示目标代码块的首个代码行行号。地址解析结果除了首行信息,还可以包括目标代码块的所在函数、所在文件。
在一个实施例中,如图4所示,所述利用所述目标符号表解析所述目标代码块地址得到目标代码块的首行信息,包括:
S401:根据所述目标代码块地址中的偏移地址在所述目标符号表确定目标映射信息;
S402:基于所述目标映射信息对所述目标代码块地址进行解析,得到所述首行信息。
结合上述步骤S202中对于模块(类目对象)-符号表对应关系的相关记载,这里不再赘述。目标符号表中不仅记录有目标代码所对应的源代码在编译阶段涉及的映射信息,还记录有属于目标模块(类目对象)的其他代码所对应的源代码在编译阶段涉及的映射信息。客户端或者服务端可以根据目标代码块地址中的偏移地址在目标符号表中确定出目标映射信息,也就是目标代码所对应的源代码在编译阶段涉及的映射信息。相应的,基于目标映射信息对目标代码块地址进行解析以得到首行信息。相较于基地址的粗定位,利用偏移地址进行细定位,可以准确确定出目标映射信息。利用目标映射信息解析目标代码块地址,没有其他无关映射信息的干扰,可以提高解析速度。
获取目标代码块地址的同时还可以确定执行目标代码的设备的arm架构(一种处理器架构)。在不存在目标代码块地址在设备间上报的情况下,当根据arm架构确定设备的本地运行环境搭建于第一类操作系统(比如由苹果公司开发的操作系统)上时,可以通过遍历方式在目标符号表确定目标映射信息,进而利用目标映射信息对目标代码块地址进行符号化处理以得到首行信息。其中,当第一类操作系统为Mac OS X或者Mac OS(Mac OS X的前身)时,可以利用atos工具(一种符号化工具)执行上述符号化处理步骤。当根据arm架构确定设备的本地运行环境搭建于第二类操作系统(比如linux)时,可以通过二分法查找的方式在目标符号表确定目标映射信息,进而利用目标映射信息解析目标代码块地址以得到首行信息。
在实际应用中,客户端所对应的操作系统为IOS系统且运行有xcode(SanitizerCoverage所对应的llvm集成于xcode),服务端所对应的操作系统为linux。客户端可以通过SanitizerCoverage获取目标代码块地址,客户端将目标代码块地址上报至服务端,服务端确定目标代码块地址对应的目标符号表、通过二分法查找的方式在目标符号表确定目标映射信息,进而利用目标映射信息解析目标代码块地址以得到首行信息。其中,客户端通过对应探针函数的反馈确定目标代码块地址时也可以确定arm架构的信息。在IOS客户端执行适配的目标代码,将获取到的目标代码块地址上报服务端进行代码覆盖信息的确定。IOS客户端可以关注于测试过程获取目标代码块地址的环节,不因确定代码覆盖信息的环节而影响本地资源处理的效率。服务端确定代码覆盖信息的环节中通过二分法查找的方式提高了确定目标映射信息的速度。
S204:根据所述首行信息和预存的关联关系表确定所述目标代码块的目标块内代码行信息,以及将所述目标块内代码行信息作为覆盖代码行信息,所述关联关系表记录代码块和对应的块内代码行之间的关联关系。
在本发明实施例中,预存的代码结构文件为目标代码所对应的源代码在编译阶段生成的,代码结构文件中记录了源代码和代码块的关联信息以及源代码行号详细信息。对代码结构文件的解析可以得到关联关系表,关联关系表记录代码块和对应的块内代码行之间的关联关系,记录代码块块内所有代码行的行号。客户端或者服务端可以根据首行信息(比如目标代码块的首个代码行行号)先在关联关系表确定匹配的目标代码块标识,再通过目标代码块标识确定目标代码块块内所有代码行的行号以得到目标块内代码行信息,进而将目标块内代码行信息作为覆盖代码行信息。其中当选用gcc进行编译时,代码结构文件为gcno文件。
在实际应用中,当客户端所对应的操作系统为IOS系统且运行有xcode(SanitizerCoverage所对应的llvm集成于xcode)时,可以采用同样集成于xcode的gcc对源代码进行编译,并将编译阶段所生成的gcno文件发送给服务端,服务端通过gcov-dump(一个转储程序,参见图7)解析该gcno文件得到关联关系表。该关联关系表可以存入数据库中以供确定块内代码行信息时查询。后续客户端可以通过SanitizerCoverage获取目标代码块地址,客户端将目标代码块地址上报至服务端,服务端根据目标代码块地址来进行覆盖代码行信息的确定。
在一个实施例中,如图5所示,所述将所述目标块内代码行信息作为覆盖代码行信息之后,所述方法还包括:
S501:基于预存的代码结构文件确定所述目标代码所对应的总代码行信息,所述代码结构文件中记录有所述目标代码的行号信息;
S502:根据所述覆盖代码行信息和所述总代码行信息得到代码覆盖率。
客户端或者服务端可以根据代码结构文件确定目标代码所对应的总代码行信息,总代码行信息可以指示(对应目标代码的)所有代码行的行号或者行数,由此得到作为分母的第一行数。而覆盖代码行信息指示目标代码块块内所有代码行的行号,由此得到作为分子的第二行数。相应的,代码覆盖率=第二行数/第一行数。当目标代码作为当前提交来测试的部分代码时,该代码覆盖率可以看作增量代码覆盖率。
基于代码覆盖率这一度量指标,一方面可以用以评估测试是否充分,一方面可以对测试用例进行管理。对测试用例进行管理中包括测试用例增加和测试用例缩减两种,其中测试用例增加(Test Suite Increasion):为了完成代码覆盖率的测试指标,需要为部分代码覆盖率较低的源文件添加新的测试用例;测试用例缩减(Test Suite Selection):对于达到代码覆盖率要求的测试用例集需要进行测试用例优化,即找到一个更小的测试用例集满足代码覆盖率的要求。
以下将介绍本申请所提供的代码覆盖信息确定方案的应用:
如图8展示了源代码的情况,利用gcc对源代码进行编译得到gcno文件,通过gcov-dump解析gcno文件得到关联关系表(可参见图9、10),关联关系表中框选出的部分可以看出这部分包括5个代码块(block 0-4),其中block 0与行号为14的代码行存在关联关系,block 1与行号为16、17的代码行存在关联关系,block 2与行号为18、19的代码行存在关联关系,block 3与行号为20的代码行存在关联关系,以及block 4与行号为22的代码行存在关联关系。
通过代码覆盖信息检测工具(比如SanitizerCoverage)获取到的目标代码块地址,利用目标符号表解析该地址得到下述地址解析结果:
Guard:0x104073244 0PC 0x104069587in-[Bingo guessNumberGame:]Bingo.m:18,其中“Bingo guessNumberGame:”为函数名,“Bingo.m”指示文件,“18”指示目标代码块的首个代码行行号。那么,根据行号“18”确定相匹配的目标代码块标识:block 2,再通过目标代码块标识确定目标代码块块内所有代码行的行号:18和19。
由以上本说明书实施例提供的技术方案可见,本说明书实施例中获取代码块地址,然后利用符号表得到代码块的首行信息,再根据首行信息和关联关系表确定覆盖代码行信息。本申请可以提高确定覆盖代码行信息的确定效率,减少卡顿,可以减少卡顿现象的出现、提高性能体验。本申请可以保证后续代码覆盖率计算的实时性,代码覆盖率可以秒出。本申请所提供的代码覆盖信息确定方案中计算环境搭建方便,进行编译器替换或者维护的需求小,能够大大降低相关的接入成本和维护成本。同时本申请不存在崩溃(crash)风险以及转储(dump)数据丢失问题,可以确保数据的完整性。
本发明实施例还提供了一种代码覆盖信息确定装置,如图11所示,所述装置包括:
第一地址获取模块1110:用于获取目标代码块地址,所述目标代码块地址是目标代码测试过程中基于探针函数得到的;
第一符号表确定模块1120:用于确定所述目标代码块地址对应的目标符号表,所述目标符号表中记录有所述目标代码所对应的源代码在编译阶段涉及的映射信息;
第一解析模块1130:用于利用所述目标符号表解析所述目标代码块地址,得到目标代码块的首行信息;
第一覆盖代码行信息确定模块1140:用于根据所述首行信息和预存的关联关系表确定所述目标代码块的目标块内代码行信息,以及将所述目标块内代码行信息作为覆盖代码行信息,所述关联关系表记录代码块和对应的块内代码行之间的关联关系。
需要说明的,所述装置实施例中的装置与方法实施例基于同样的发明构思。
以下介绍本发明一种代码覆盖信息确定方法的具体实施例,图3是本发明实施例提供的一种代码覆盖信息确定方法的流程示意图,本说明书提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的劳动可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的系统或产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境)。具体的如图3所示,所述方法可以包括:
S301:客户端在测试目标代码过程中基于探针函数得到目标代码块地址;
S302:所述客户端将所述目标代码块地址上报至服务端;
S303:所述服务端确定所述目标代码块地址对应的目标符号表,所述目标符号表中记录有所述目标代码所对应的源代码在编译阶段涉及的映射信息;
S304:所述服务端利用所述目标符号表解析所述目标代码块地址,得到目标代码块的首行信息;
S305:所述服务端根据所述首行信息和预存的关联关系表确定所述目标代码块的目标块内代码行信息,以及将所述目标块内代码行信息作为覆盖代码行信息,所述关联关系表记录代码块和对应的块内代码行之间的关联关系。
客户端获取的目标代码块地址的步骤可以参考前述步骤S201中的相关记载,不再赘述。服务端根据目标代码块地址确定覆盖代码行信息的步骤可以参考前述步骤S202-S204中的相关记载,不再赘述。
在实际应用中,客户端所对应的操作系统为IOS系统且运行有xcode(SanitizerCoverage所对应的llvm集成于xcode),服务端所对应的操作系统为linux。客户端可以通过SanitizerCoverage获取目标代码块地址,客户端将目标代码块地址上报至服务端,服务端确定目标代码块地址对应的目标符号表、进而利用目标符号表解析目标代码块地址以得到首行信息,服务端再根据首行信息和关联关系表确定目标代码块的目标块内代码行信息以得到覆盖代码行信息。
包括上述客户端和服务端的代码覆盖信息确定系统可以参考图6、7所示的架构设计,在该系统的配置中涉及到xcode工程配置修改、xcode pod(一种第三方管理工具)集成第三方代码、符号表的收集、gcno文件的收集、linux后台通过gcov-dump解析客户端上报的代码块地址。具体包括:
1)打开gcc工程配置开关
工程配置中,如图13所示,设置Enable Code Coverage Support(启用代码覆盖率支持)的选项、Generate Legacy Test Coverage Files(生成默认测试覆盖率文件)的选项为Yes(是)。如图14所示,设置Instrument Program Flow(插桩程序流程)的选项为Yes。在xcode对源代码进行编译后,gcc通过这里的相关设置(包括插桩程序流程的设置)可以得到gcno文件。
2)开启SanitizerCoverage配置
如图5所示,在工程配置other c flags(一个命令行选项)中添加-fsanitize-coverage=bb,no-prune,trace-pc-guard,即实现对代码块的插桩。其中,“-fsanitize-coverage”指示命令,“bb”指示代码块。
3)插入插桩代码
插桩代码可通过SDK(软件开发工具包)插入方式、Pod引入方式插入,插桩代码主要用于实现:插桩回调函数(比如__sanitizer_cov_trace_pc_guard_init、__sanitizer_cov_trace_pc_guard)、代码块地址上报以及设备信息以及模块信息上报。其中,__sanitizer_cov_trace_pc_guard_init、__sanitizer_cov_trace_pc_guard可以作为SanitizerCoverage获取目标代码块地址的探针函数。
4)gcno文件和符号表上传后台
gcc配置开关打开以及SanitizerCoverage配置开启后,xcode编译源代码(比如某app的源代码)生成gcno文件。客户端压缩gcno文件并上传后台,后台会从gcno解析得到代码块和代码行的对应关系(关联关系表)。
编译过程生成的dSYM文件(符号表)也需要上传至后台,后台会通过符号表解析客户端上报的地址得到代码块的相关信息。
比如客户端上报至后台目标代码块地址为:
atos-o yourAppName.app.dSYM/Contents/Resources/DWARF/yourAppName-archarm64/armv7-1<load-address><address>,其中“yourAppName.app.dSYM”指示符号表,“arm64/armv7”指示执行目标代码的设备(对应客户端)的arm架构,携带“address”的字段指示具体的目标代码块地址。由于atos是mac上的工具,其没法在linux上使用。这里借助其他分析工具(比如Bugly)的java(一门面向对象编程语言)包和目标符号表解析目标代码块地址。
如图6所示,其中的数字标号指示了代码覆盖信息确定方案的执行顺序,其中标号1示出了在编译过程中、目标代码运行前将符号表和代码结构文件存入后台的步骤,目标代码所对应的总代码行信息可以从基础数据(对应标号2)获取到,标号3示出了目标代码运行中客户端将获取的目标代码块地址上报至服务端的步骤,标号7-8示出了根据当前所有任务为当前任务数据分配任务标识的步骤。
如图7所示,图7中客户端涉及的相关步骤可参见前述“1)打开gcc工程配置开关-4)gcno文件和符号表上传后台”中的相关记载。对于图7中的后台,通过gcov-dump(一个转储程序)解析该gcno文件得到关联关系表,该关联关系表可以存入数据库中以供确定块内代码行信息时查询。对于图7中前端,可以对后台计算出的代码覆盖信息进行可视化展示。
本发明实施例所提供的代码覆盖信息确定方案可以用于基于IOS开发的应用程序的代码覆盖率收集,以实时获取所操作app的代码覆盖率。基于代码覆盖率,测试人员可以对开发人员所提交代码的用例场景进行完善,开发人员可以自行评估是否存在无效代码需要优化。其中基于IOS开发的应用程序可以为主程序,也可以为以主程序为载体的小程序。应用程序可以为社交类应用、具备娱乐功能的应用(如视频应用、音频应用、游戏应用和阅读软件)以及具备服务功能的应用(如地图导航应用、团购应用)。
由以上本说明书实施例提供的技术方案可见,本说明书实施例中获取代码块地址,然后利用符号表得到代码块的首行信息,再根据首行信息和关联关系表确定覆盖代码行信息。本申请可以提高确定覆盖代码行信息的确定效率,减少卡顿,可以减少卡顿现象的出现、提高性能体验。本申请可以保证后续代码覆盖率计算的实时性,代码覆盖率可以秒出。本申请所提供的代码覆盖信息确定方案中计算环境搭建方便,进行编译器替换或者维护的需求小,能够大大降低相关的接入成本和维护成本。同时本申请不存在崩溃(crash)风险以及转储(dump)数据丢失问题,可以确保数据的完整性。
本发明实施例还提供了一种代码覆盖信息确定系统,所述系统包括:
客户端,所述客户端包括:第二地址获取模块:用于在测试目标代码过程中基于探针函数得到目标代码块地址;上报模块:用于将所述目标代码块地址上报至服务端;
以及所述服务端,所述服务端包括:第二符号表确定模块:用于确定所述目标代码块地址对应的目标符号表,所述目标符号表中记录有所述目标代码所对应的源代码在编译阶段涉及的映射信息;第二解析模块:用于利用所述目标符号表解析所述目标代码块地址,得到目标代码块的首行信息;第二覆盖代码行信息确定模块:用于根据所述首行信息和预存的关联关系表确定所述目标代码块的目标块内代码行信息,以及将所述目标块内代码行信息作为覆盖代码行信息,所述关联关系表记录代码块和对应的块内代码行之间的关联关系。
需要说明的,所述系统实施例中的系统与方法实施例基于同样的发明构思。
本发明实施例提供了一种电子设备,该电子设备包括处理器和存储器,该存储器中存储有至少一条指令或至少一段程序,该至少一条指令或该至少一段程序由该处理器加载并执行以实现如上述方法实施例所提供的代码覆盖信息确定方法。
进一步地,图12示出了一种用于实现本发明实施例所提供的代码覆盖信息确定方法的电子设备的硬件结构示意图,所述电子设备可以参与构成或包含本发明实施例所提供的代码覆盖信息确定装置。如图12所示,电子设备120可以包括一个或多个(图中采用1202a、1202b,……,1202n来示出)处理器1202(处理器1202可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)、用于存储数据的存储器1204、以及用于通信功能的传输装置1206。除此以外,还可以包括:显示器、输入/输出接口(I/O接口)、通用串行总线(USB)端口(可以作为I/O接口的端口中的一个端口被包括)、网络接口、电源和/或相机。本领域普通技术人员可以理解,图12所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,电子设备120还可包括比图12中所示更多或者更少的组件,或者具有与图12所示不同的配置。
应当注意到的是上述一个或多个处理器1202和/或其他数据处理电路在本文中通常可以被称为“数据处理电路”。该数据处理电路可以全部或部分的体现为软件、硬件、固件或其他任意组合。此外,数据处理电路可为单个独立的处理模块,或全部或部分的结合到电子设备120(或移动设备)中的其他元件中的任意一个内。如本申请实施例中所涉及到的,该数据处理电路作为一种处理器控制(例如与接口连接的可变电阻终端路径的选择)。
存储器1204可用于存储应用软件的软件程序以及模块,如本发明实施例中所述的代码覆盖信息确定方法对应的程序指令/数据存储装置,处理器1202通过运行存储在存储器124内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的一种代码覆盖信息确定方法。存储器1204可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器1204可进一步包括相对于处理器1202远程设置的存储器,这些远程存储器可以通过网络连接至电子设备120。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
传输装置1206用于经由一个网络接收或者发送数据。上述的网络具体实例可包括电子设备120的通信供应商提供的无线网络。在一个实例中,传输装置1206包括一个网络适配器(NetworkInterfaceController,NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实施例中,传输装置1206可以为射频(RadioFrequency,RF)模块,其用于通过无线方式与互联网进行通讯。
显示器可以例如触摸屏式的液晶显示器(LCD),该液晶显示器可使得用户能够与电子设备120(或移动设备)的用户界面进行交互。
本发明的实施例还提供了一种计算机可读存储介质,所述存储介质可设置于电子设备之中以保存用于实现方法实施例中一种代码覆盖信息确定方法相关的至少一条指令或至少一段程序,该至少一条指令或该至少一段程序由该处理器加载并执行以实现上述方法实施例提供的代码覆盖信息确定方法。
可选地,在本实施例中,上述存储介质可以位于计算机网络的多个网络服务器中的至少一个网络服务器。可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
需要说明的是:上述本发明实施例先后顺序仅仅为了描述,不代表实施例的优劣。且上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置和电子设备实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种代码覆盖信息确定方法,其特征在于,所述方法包括:
获取目标代码块地址,所述目标代码块地址是目标代码测试过程中基于探针函数得到的;
确定所述目标代码块地址对应的目标符号表,所述目标符号表中记录有所述目标代码所对应的源代码在编译阶段涉及的映射信息;
利用所述目标符号表解析所述目标代码块地址,得到目标代码块的首行信息;
根据所述首行信息和预存的关联关系表确定所述目标代码块的目标块内代码行信息,以及将所述目标块内代码行信息作为覆盖代码行信息,所述关联关系表记录代码块和对应的块内代码行之间的关联关系。
2.根据权利要求1所述的方法,其特征在于,所述将所述目标块内代码行信息作为覆盖代码行信息之后,所述方法还包括:
基于预存的代码结构文件确定所述目标代码所对应的总代码行信息,所述代码结构文件中记录有所述目标代码的行号信息;
根据所述覆盖代码行信息和所述总代码行信息得到代码覆盖率。
3.根据权利要求1所述的方法,其特征在于,所述确定所述目标代码块地址对应的目标符号表,包括:
根据所述目标代码块地址中的基地址在预存的基地址集中确定目标基地址;
确定所述目标基地址所对应的目标类目对象,不同类目对象指示不同的代码集合,所述代码集合配置有对应的符号表;
将所述目标类目对象对应的符号表作为所述目标符号表。
4.根据权利要求1所述的方法,其特征在于,所述利用所述目标符号表解析所述目标代码块地址得到目标代码块的首行信息,包括:
根据所述目标代码块地址中的偏移地址在所述目标符号表确定目标映射信息;
基于所述目标映射信息对所述目标代码块地址进行解析,得到所述首行信息。
5.根据权利要求1所述的方法,其特征在于,所述获取目标代码块地址之前,所述方法还包括:
获取所述源代码;
利用编译器对所述源代码进行编译得到所述目标代码;
向所述目标代码逐块注入探针函数。
6.一种代码覆盖信息确定方法,其特征在于,所述方法包括:
客户端在测试目标代码过程中基于探针函数得到目标代码块地址;
所述客户端将所述目标代码块地址上报至服务端;
所述服务端确定所述目标代码块地址对应的目标符号表,所述目标符号表中记录有所述目标代码所对应的源代码在编译阶段涉及的映射信息;
所述服务端利用所述目标符号表解析所述目标代码块地址,得到目标代码块的首行信息;
所述服务端根据所述首行信息和预存的关联关系表确定所述目标代码块的目标块内代码行信息,以及将所述目标块内代码行信息作为覆盖代码行信息,所述关联关系表记录代码块和对应的块内代码行之间的关联关系。
7.一种代码覆盖信息确定装置,其特征在于,所述装置包括:
第一地址获取模块:用于获取目标代码块地址,所述目标代码块地址是目标代码测试过程中基于探针函数得到的;
第一符号表确定模块:用于确定所述目标代码块地址对应的目标符号表,所述目标符号表中记录有所述目标代码所对应的源代码在编译阶段涉及的映射信息;
第一解析模块:用于利用所述目标符号表解析所述目标代码块地址,得到目标代码块的首行信息;
第一覆盖代码行信息确定模块:用于根据所述首行信息和预存的关联关系表确定所述目标代码块的目标块内代码行信息,以及将所述目标块内代码行信息作为覆盖代码行信息,所述关联关系表记录代码块和对应的块内代码行之间的关联关系。
8.一种代码覆盖信息确定系统,其特征在于,所述系统包括:
客户端,所述客户端包括:第二地址获取模块:用于在测试目标代码过程中基于探针函数得到目标代码块地址;上报模块:用于将所述目标代码块地址上报至服务端;
以及所述服务端,所述服务端包括:第二符号表确定模块:用于确定所述目标代码块地址对应的目标符号表,所述目标符号表中记录有所述目标代码所对应的源代码在编译阶段涉及的映射信息;第二解析模块:用于利用所述目标符号表解析所述目标代码块地址,得到目标代码块的首行信息;第二覆盖代码行信息确定模块:用于根据所述首行信息和预存的关联关系表确定所述目标代码块的目标块内代码行信息,以及将所述目标块内代码行信息作为覆盖代码行信息,所述关联关系表记录代码块和对应的块内代码行之间的关联关系。
9.一种电子设备,所述电子设备包括处理器和存储器,所述存储器中存储有至少一条指令或至少一段程序,所述至少一条指令或所述至少一段程序由所述处理器加载并执行以实现如权利要求1-6任一所述的代码覆盖信息确定方法或者如权利要求7所述的代码覆盖信息确定方法。
10.一种计算机可读存储介质,所述存储介质中存储有至少一条指令或至少一段程序,所述至少一条指令或所述至少一段程序由处理器加载并执行以实现如权利要求1-6任一所述的代码覆盖信息确定方法或者如权利要求7所述的代码覆盖信息确定方法。
CN202011230626.3A 2020-11-06 2020-11-06 一种代码覆盖信息确定方法、装置、系统及介质 Pending CN114443461A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011230626.3A CN114443461A (zh) 2020-11-06 2020-11-06 一种代码覆盖信息确定方法、装置、系统及介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011230626.3A CN114443461A (zh) 2020-11-06 2020-11-06 一种代码覆盖信息确定方法、装置、系统及介质

Publications (1)

Publication Number Publication Date
CN114443461A true CN114443461A (zh) 2022-05-06

Family

ID=81361565

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011230626.3A Pending CN114443461A (zh) 2020-11-06 2020-11-06 一种代码覆盖信息确定方法、装置、系统及介质

Country Status (1)

Country Link
CN (1) CN114443461A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117171057A (zh) * 2023-11-02 2023-12-05 沐曦集成电路(上海)有限公司 芯片软硬件联合仿真阶段的软件代码覆盖率确定系统

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117171057A (zh) * 2023-11-02 2023-12-05 沐曦集成电路(上海)有限公司 芯片软硬件联合仿真阶段的软件代码覆盖率确定系统
CN117171057B (zh) * 2023-11-02 2024-01-26 沐曦集成电路(上海)有限公司 芯片软硬件联合仿真阶段的软件代码覆盖率确定系统

Similar Documents

Publication Publication Date Title
CN105094783B (zh) 安卓应用稳定性测试的方法及装置
Wehrle et al. Modeling and tools for network simulation
CN101521899B (zh) 用于移动应用程序的机上测试系统和方法
CN108170612B (zh) 一种自动化测试方法、装置及服务器
US7881440B2 (en) Method for automatic graphical profiling of a system
WO2011060655A1 (zh) 软件业务功能覆盖率的统计方法及系统
CN102722440A (zh) 一种嵌入式系统可执行代码的调试装置、调试方法及嵌入式系统
US8418145B2 (en) Simple method optimization
CN107480036A (zh) iOS移动应用的自动测试方法、装置、存储介质及终端
CN111124789B (zh) 一种芯片仿真调试系统及调试方法
CN110674047A (zh) 软件测试方法、装置及电子设备
CN107977318B (zh) 一种Android应用程序的能耗和性能测试方法
CN109408309A (zh) 多终端的测试方法及装置
CN102750143B (zh) 基于matlab com组件调用的dsp开发方法
CN109542444B (zh) Java应用的监控方法、装置、服务器和存储介质
CN111858354A (zh) 自动生成测试报告的方法、装置、存储介质及电子设备
CN113297064A (zh) 代码覆盖率测试方法、系统、设备及存储介质
CN114443461A (zh) 一种代码覆盖信息确定方法、装置、系统及介质
US20130307854A1 (en) Method and System for Visualising a System Model
CN110134583B (zh) 软件测试及数据处理方法及装置
CN111428117A (zh) 应用程序的数据获取方法和装置
CN115934199A (zh) 服务性能监控工具、方法、设备及介质
CN113688134B (zh) 基于多维数据的可视化变量管理方法、系统及设备
CN113806231A (zh) 一种代码覆盖率分析方法、装置、设备和介质
CN113220586A (zh) 一种自动化的接口压力测试执行方法、装置和系统

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination