*nix Documentation Project
·  Home
 +   man pages
·  Linux HOWTOs
·  FreeBSD Tips
·  *niX Forums

  man pages->OpenBSD man pages -> gcov (1)              
Title
Content
Arch
Section
 

GCOV(1)

Contents


NAME    [Toc]    [Back]

     gcov - test coverage program

SYNOPSIS    [Toc]    [Back]

     gcov [-b] [-v] [-n] [-l] [-f] [-o directory] sourcefile

DESCRIPTION    [Toc]    [Back]

     The gcov utility is a test coverage program.  Use it in concert with
     gcc(1)  to  analyze  programs to help create more efficient,
faster running
     code.  gcov can be used as a profiling tool to help discover
where optimization
  efforts  will best affect the code.  gcov can also
be used along
     with the other profiling  tool  gprof(1),  to  assess  which
parts of the code
     use the greatest amount of computing time.

     Profiling  tools help analyze the code's performance.  Using
a profiler
     such as gcov or gprof(1), basic performance  statistics  can
be obtained,
     such as:

           +o   how often each line of code executes
           +o   what lines of code are actually executed
           +o   how much computing time each section of code uses

     Once  you  know  these things about how your code works when
compiled, you
     can look at each module to see which modules should be optimized.  gcov
     helps determine where to work on optimization.

     Software  developers  also  use  coverage testing in concert
with testsuites,
     to make sure software is actually good enough for a release.
Testsuites
     can verify that a program works as expected; a coverage program tests to
     see how much of the program is exercised by  the  testsuite.
Developers
     can then determine what kinds of test cases need to be added
to the testsuites
 to create both better  testing  and  a  better  final
product.

     Code should be compiled without optimization when using gcov
because the
     optimization, by combining some lines of code into one function, may not
     give  as  much  information  as  necessary  to look for `hot
spots' where the
     code is using a great deal of computer time.  Likewise,  because gcov accumulates
  statistics by line (at the lowest resolution), it
works best
     with a programming style that places only one  statement  on
each line.  If
     complicated  macros that expand to loops or to other control
structures
     are used, the statistics are less helpful - they only report
on the line
     where the macro call appears.  If complex macros behave like
functions,
     they can be replaced  with inline functions  to  solve  this
problem.

     gcov  creates a logfile called `sourcefile.gcov' which indicates how many
     times each line of a source file `sourcefile.c' has  executed.  These logfiles
  can  then be used along with gprof(1) to aid in finetuning the performance
 of the programs.  gprof(1) gives timing information
which can be
     used along with the information you obtained from gcov.

     gcov  works  only  on  code compiled with GNU CC.  It is not
compatible with
     any other profiling or test coverage mechanism.

     gcov accepts the following options:

     -b      Write branch frequencies to  the  output  file,  and
write branch
             summary  info  to  the standard output.  This option
indicates how
             often each branch in the program was taken.

     -v      Display the gcov version number (on the standard error stream).

     -n      Do not create the gcov output file.

     -l       Create  long  file names for included source files.
For example,
             if the header file x.h contains code,  and  was  included in the
             file  a.c,  then  running  gcov on the file a.c will
produce an output
 file called a.c.x.h.gcov  instead  of  x.h.gcov.
This can be
             useful  if x.h is included in multiple source files.

     -f      Output summaries for each function  in  addition  to
the file level
             summary.

     -o directory
             The  directory  where  the  object files live.  gcov
will search for
             .bb, .bbg, and .da files in this directory.

     When using gcov, programs must first be  compiled  with  two
special GNU CC
     options:  -fprofile-arcs  -ftest-coverage.   This  tells the
compiler to generate
 additional information needed  by  gcov  (basically  a
flow graph of
     the program) and also includes additional code in the object
files for
     generating the extra profiling information needed  by  gcov.
These additional
  files  are  placed in the directory where the source
code is located.


     Running the program will cause profile output to be generated.  For each
     source  file  compiled  with -fprofile-arcs, an accompanying
.da file will
     be placed in the source directory.

     Running gcov with the program's source file names  as  arguments will now
     produce a listing of the code along with frequency of execution for each
     line.  For example, if the program is called tmp.c, this  is
what is displayed
 when using the basic gcov facility:

           $ gcc -fprofile-arcs -ftest-coverage tmp.c
           $ a.out
           $ gcov tmp.c
            87.50% of 8 source lines executed in file tmp.c
           Creating tmp.c.gcov.

     The  file  tmp.c.gcov  contains output from gcov.  Here is a
sample:

                   main()
                   {
                1      int i, total;

                1      total = 0;

               11      for (i = 0; i < 10; i++)
               10          total += i;

                1      if (total != 45)
           ######          printf ("Failure0);
                       else
                1          printf ("Success0);
                1    }

     When the -b option is used, output looks like this:

           $ gcov -b tmp.c
            87.50% of 8 source lines executed in file tmp.c
            80.00% of 5 branches executed in file tmp.c
            80.00% of 5 branches taken  at  least  once  in  file
tmp.c
            50.00% of 2 calls executed in file tmp.c
           Creating tmp.c.gcov.

     Here is a sample of a resulting tmp.c.gcov file:

                           main()
                           {
                      1        int i, total;

                      1        total = 0;

                     11        for (i = 0; i < 10; i++)
           branch 0 taken = 91%
           branch 1 taken = 100%
           branch 2 taken = 100%
                     10        total += i;

                      1        if (total != 45)
           branch 0 taken = 100%
                 ######            printf ("Failure0);
           call 0 never executed
           branch 1 never executed
                               else
                      1            printf ("Success0);
           call 0 returns = 100%
                      1    }

     For  each basic block, a line is printed after the last line
of the basic
     block describing the branch or  call  that  ends  the  basic
block.  There can
     be  multiple  branches  and calls listed for a single source
line if there
     are multiple basic blocks that end on that  line.   In  this
case, the
     branches  and  calls  are  each given a number.  There is no
simple way to
     map these branches and calls back to source constructs.   In
general,
     though,  the  lowest numbered branch or call will correspond
to the leftmost
 construct on the source line.

     For a branch, if it was executed at least once, then a  percentage indicating
  the  number of times the branch was taken divided by
the number of
     times the branch was executed will be  printed.   Otherwise,
the message
     "never executed" is printed.

     For  a  call,  if it was executed at least once, then a percentage indicating
 the number of times the call  returned  divided  by  the
number of times
     the call was executed will be printed.  This will usually be
100%, but
     may be less for functions which call  `exit'  or  `longjmp',
and thus may
     not return every time they are called.

     The execution counts are cumulative.  If the example program
were executed
 again without removing the .da file, the  count  for  the
number of times
     each  line  in the source was executed would be added to the
results of the
     previous run(s).  This  is  potentially  useful  in  several
ways.  For example,
  it  could  be used to accumulate data over a number of
program runs as
     part of a test verification suite, or to provide more  accurate long-term
     information over a large number of program runs.

     The  data  in  the .da files is saved immediately before the
program exits.
     For each source file compiled with -fprofile-arcs, the  profiling code
     first  attempts to read in an existing .da file; if the file
doesn't match
     the executable (differing number of basic block  counts)  it
will ignore
     the contents of the file.  It then adds in the new execution
counts and
     finally writes the data to the file.

USING GCOV WITH GCC OPTIMIZATION    [Toc]    [Back]

     If gcov is to be used to help optimize code,  programs  must
be compiled
     with    two   special   GNU   CC   options:   -fprofile-arcs
-ftest-coverage.  Aside
     from that, any other GNU CC options can be used; but if  you
want to prove
     that  every  single  line  in your program was executed, you
should not compile
 with optimization at the same time.  On  some  machines
the optimizer
     can  eliminate some simple code lines by combining them with
other lines.
     For example, code like this:

           if (a != b)
             c = 1;
           else
             c = 0;

     can be compiled into one instruction on some  machines.   In
this case,
     there  is  no  way  for gcov to calculate separate execution
counts for each
     line because there isn't separate code for each line.  Hence
the gcov
     output looks like this if the program is compiled with optimization:

           100  if (a != b)
           100      c = 1;
           100  else
           100      c = 0;

     The output shows that this block of code, combined by  optimization, executed
  100  times.  In one sense this result is correct, because there was
     only one instruction representing all four of  these  lines.
However, the
     output does not indicate how many times the result was 0 and
how many
     times the result was 1.

BRIEF DESCRIPTION OF GCOV DATA FILES    [Toc]    [Back]

     gcov uses three files for doing  profiling.   The  names  of
these files are
     derived  from the original _source_ file by substituting the
file suffix
     with either .bb, .bbg, or  .da.   All  of  these  files  are
placed in the same
     directory  as  the source file, and contain data stored in a
platform-independent
 method.

     The .bb and .bbg files are generated when the source file is
compiled
     with  the  GNU CC -ftest-coverage option.  The .bb file contains a list of
     source files (including  headers),  functions  within  those
files, and line
     numbers  corresponding  to  each  basic  block in the source
file.

     The .bb file format consists of several lists of 4-byte  integers which
     correspond  to  the  line numbers of each basic block in the
file.  Each
     list is terminated by a line number of 0.  A line number  of
-1 is used to
     designate  that  the  source  file  name (padded to a 4-byte
boundary and followed
 by another -1) follows.  In addition, a line number of
-2 is used
     to  designate  that the name of a function (also padded to a
4-byte boundary
 and followed by a -2) follows.

     The .bbg file is used to reconstruct the program flow  graph
for the
     source  file.   It  contains a list of the program flow arcs
(possible
     branches taken from one basic block  to  another)  for  each
function which,
     in  combination  with  the  .bb file, enables gcov to reconstruct the program
     flow.

     In the .bbg file, the format is:

           number of basic blocks for function #0 (4-byte number)
           total number of arcs for function #0 (4-byte number)
           count of arcs in basic block #0 (4-byte number)
           destination basic block of arc #0 (4-byte number)
           flag bits (4-byte number)
           destination basic block of arc #1 (4-byte number)
           flag bits (4-byte number)
           ...
           destination basic block of arc #N (4-byte number)
           flag bits (4-byte number)
           count of arcs in basic block #1 (4-byte number)
           destination basic block of arc #0 (4-byte number)
           flag bits (4-byte number)
           ...

     A  -1  (stored  as a 4-byte number) is used to separate each
function's list
     of basic blocks, and to verify that the file has  been  read
correctly.

     The  .da  file is generated when a program containing object
files built
     with the GNU CC -fprofile-arcs option is executed.  A  separate .da file
     is  created  for each source file compiled with this option,
and the name
     of the .da file is stored as an absolute pathname in the resulting object
     file.   This  path name is derived from the source file name
by substituting
 a .da suffix.

     The format of the .da file  is  fairly  simple.   The  first
8-byte number is
     the  number  of  counts  in the file, followed by the counts
(stored as
     8-byte numbers).  Each count corresponds to  the  number  of
times each arc
     in the program is executed.  The counts are cumulative; each
time the
     program is executed, it attempts to combine the existing .da
files with
     the  new  counts for this invocation of the program.  It ignores the contents
 of any .da files whose number of arcs  doesn't  correspond to the
     current program, and merely overwrites them instead.

     All  three  of these files use the functions in gcov-io.h to
store integers;
 the functions in this header provide  a  machine-independent mechanism
 for storing and retrieving data from a stream.

SEE ALSO    [Toc]    [Back]

      
      
     gcc(1), gcc-local(1), gprof(1)

HISTORY    [Toc]    [Back]

     This man page describes version 1.5 of gcov.

OpenBSD      3.6                        February     15,     2003
[ Back ]
 Similar pages
Name OS Title
cvcov IRIX The WorkShop Test Coverage Tool
cvxcov IRIX The WorkShop Test Coverage Tool
try-from Linux test program for the tcp_wrapper
x11perf Tru64 X11 server performance test program
xieperf Tru64 XIE server extension test and demo program
gcov FreeBSD coverage testing tool
gcov NetBSD display basic block profile / coverage data
setmemwindow HP-UX changes the window id of a running program or starts a program in a particular memory window
ttcp IRIX test TCP and UDP performance
feof Tru64 Test for EOF on a stream
Copyright © 2004-2005 DeniX Solutions SRL
newsletter delivery service