Follow Techotopia on Twitter

On-line Guides
All Guides
eBook Store
iOS / Android
Linux for Beginners
Office Productivity
Linux Installation
Linux Security
Linux Utilities
Linux Virtualization
Linux Kernel
System/Network Admin
Programming
Scripting Languages
Development Tools
Web Development
GUI Toolkits/Desktop
Databases
Mail Systems
openSolaris
Eclipse Documentation
Techotopia.com
Virtuatopia.com

How To Guides
Virtualization
General System Admin
Linux Security
Linux Filesystems
Web Servers
Graphics & Desktop
PC Hardware
Windows
Problem Solutions

  




 

 

10.3 Coverage testing with gcov

The GNU coverage testing tool gcov analyses the number of times each line of a program is executed during a run. This makes it possible to find areas of the code which are not used, or which are not exercised in testing. When combined with profiling information from gprof the information from coverage testing allows efforts to speed up a program to be concentrated on specific lines of the source code.

We will use the example program below to demonstrate gcov. This program loops overs the integers 1 to 9 and tests their divisibility with the modulus (%) operator.

#include <stdio.h>

int
main (void)
{
  int i;

  for (i = 1; i < 10; i++)
    {
      if (i % 3 == 0)
        printf ("%d is divisible by 3\n", i);
      if (i % 11 == 0)
        printf ("%d is divisible by 11\n", i);
    }

  return 0;
}

To enable coverage testing the program must be compiled with the following options:

$ gcc -Wall -fprofile-arcs -ftest-coverage cov.c

This creates an instrumented executable which contains additional instructions that record the number of times each line of the program is executed. The option -ftest-coverage adds instructions for counting the number of times individual lines are executed, while -fprofile-arcs incorporates instrumentation code for each branch of the program. Branch instrumentation records how frequently different paths are taken through 'if' statements and other conditionals. The executable must then be run to create the coverage data:

$ ./a.out 
3 is divisible by 3
6 is divisible by 3
9 is divisible by 3

The data from the run is written to several files with the extensions '.bb' '.bbg' and '.da' respectively in the current directory. This data can be analyzed using the gcov command and the name of a source file:

$ gcov cov.c 
 88.89% of 9 source lines executed in file cov.c
Creating cov.c.gcov

The gcov command produces an annotated version of the original source file, with the file extension '.gcov', containing counts of the number of times each line was executed:

        #include <stdio.h>

        int
        main (void)
        {
     1    int i;

    10    for (i = 1; i < 10; i++)
            {
     9        if (i % 3 == 0)
     3          printf ("%d is divisible by 3\n", i);
     9        if (i % 11 == 0)
######          printf ("%d is divisible by 11\n", i);
     9      }

     1    return 0;
     1  }

The line counts can be seen in the first column of the output. Lines which were not executed are marked with hashes '######'. The command 'grep '######' *.gcov' can be used to find parts of a program which have not been used.


 
 
  Published under the terms of the GNU General Public License Design by Interspire