利用gcov实现代码覆盖率检测

一、GCOV简介

Gcov工具的基本功能是可以查看测试时代码执行的覆盖率,包括函数覆盖,语句覆盖,分支覆盖等覆盖内容。有助于分析被测程序的缺陷。使用该工具可以查看程序在某分支处的执行频率,从而分析程序的性能。

二、GCOV使用

gcov伴随gcc 发布。gcc编译加入-fprofile-arcs -ftest-coverage 参数生成二进制程序,执行测试用例生成代码覆盖率信息。
fprofile-arcs参数使gcc创建一个程序的流图,之后找到适合图的生成树。只有不在生成树中的弧被操纵(instrumented):gcc添加了代码来清点这些弧执行的次数。当这段弧是一个块的唯一出口或入口时,操纵工具代码(instrumentation code)将会添加到块中,否则创建一个基础块来包含操纵工具代码。

gcov主要使用.gcno和.gcda两个文件。

  • gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。
  • gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息(而gcda只能在程序运行完毕后才能产生的)。

话不多说,举个栗子。
手头有一个hello.c的例子,源代码如下:


> #include
#include
void main()
{
    int i = 1;
    if(i == 1)
    printf("helloworld!\n");
    else
    printf("im not good!\n");
}
编译:`gcc hello.c -fprofile-arcs -ftest-coverage -o hello`
运行:`./hello` 输出:`helloworld!`
执行:gcov hello.c 

输出如下:
File 'hello.c'
Lines executed:83.33% of 6
Creating 'hello.c.gcov'

由上可知:在执行gcov hello.c 的同时,生成了hello.c.gcov文件
下面查看gcov文件:
cat hello.c.gcov

输出如下: -: 0:Source:hello.c

    1:    3:void main()
    -:    4:{
    1:    5:    int i = 1;
    1:    6:    if(i == 1)
    1:    7:    printf("helloworld!\n");
    -:    8:    else
#####:    9:    printf("im not good!\n");
    1:   10:}

你可能感兴趣的:(Linux,gcc,代码覆盖率,软件测试,Linux)