gcov.texi

来自「理解和实践操作系统的一本好书」· TEXI 代码 · 共 574 行 · 第 1/2 页

TEXI
574
字号
The file @file{tmp.c.gcov} contains output from @command{gcov}.Here is a sample:@smallexample        -:    0:Source:tmp.c        -:    0:Graph:tmp.gcno        -:    0:Data:tmp.gcda        -:    0:Runs:1        -:    0:Programs:1        -:    1:#include <stdio.h>        -:    2:        -:    3:int main (void)        1:    4:@{        1:    5:  int i, total;        -:    6:        1:    7:  total = 0;        -:    8:       11:    9:  for (i = 0; i < 10; i++)       10:   10:    total += i;        -:   11:        1:   12:  if (total != 45)    #####:   13:    printf ("Failure\n");        -:   14:  else        1:   15:    printf ("Success\n");        1:   16:  return 0;        -:   17:@}@end smallexampleWhen you use the @option{-a} option, you will get individual blockcounts, and the output looks like this:@smallexample        -:    0:Source:tmp.c        -:    0:Graph:tmp.gcno        -:    0:Data:tmp.gcda        -:    0:Runs:1        -:    0:Programs:1        -:    1:#include <stdio.h>        -:    2:        -:    3:int main (void)        1:    4:@{        1:    4-block  0        1:    5:  int i, total;        -:    6:        1:    7:  total = 0;        -:    8:       11:    9:  for (i = 0; i < 10; i++)       11:    9-block  0       10:   10:    total += i;       10:   10-block  0        -:   11:        1:   12:  if (total != 45)        1:   12-block  0    #####:   13:    printf ("Failure\n");    $$$$$:   13-block  0        -:   14:  else        1:   15:    printf ("Success\n");        1:   15-block  0        1:   16:  return 0;        1:   16-block  0        -:   17:@}@end smallexampleIn this mode, each basic block is only shown on one line -- the lastline of the block.  A multi-line block will only contribute to theexecution count of that last line, and other lines will not be shownto contain code, unless previous blocks end on those lines.The total execution count of a line is shown and subsequent lines showthe execution counts for individual blocks that end on that line.  After eachblock, the branch and call counts of the block will be shown, if the@option{-b} option is given.Because of the way GCC instruments calls, a call count can be shownafter a line with no individual blocks.As you can see, line 13 contains a basic block that was not executed.@need 450When you use the @option{-b} option, your output looks like this:@smallexample$ gcov -b tmp.c90.00% of 10 source lines executed in file tmp.c80.00% of 5 branches executed in file tmp.c80.00% of 5 branches taken at least once in file tmp.c50.00% of 2 calls executed in file tmp.cCreating tmp.c.gcov.@end smallexampleHere is a sample of a resulting @file{tmp.c.gcov} file:@smallexample        -:    0:Source:tmp.c        -:    0:Graph:tmp.gcno        -:    0:Data:tmp.gcda        -:    0:Runs:1        -:    0:Programs:1        -:    1:#include <stdio.h>        -:    2:        -:    3:int main (void)function main called 1 returned 1 blocks executed 75%        1:    4:@{        1:    5:  int i, total;        -:    6:        1:    7:  total = 0;        -:    8:       11:    9:  for (i = 0; i < 10; i++)branch  0 taken 91% (fallthrough)branch  1 taken 9%       10:   10:    total += i;        -:   11:        1:   12:  if (total != 45)branch  0 taken 0% (fallthrough)branch  1 taken 100%    #####:   13:    printf ("Failure\n");call    0 never executed        -:   14:  else        1:   15:    printf ("Success\n");call    0 called 1 returned 100%        1:   16:  return 0;        -:   17:@}@end smallexampleFor each function, a line is printed showing how many times the functionis called, how many times it returns and what percentage of thefunction's blocks were executed.For each basic block, a line is printed after the last line of the basicblock describing the branch or call that ends the basic block.  There canbe multiple branches and calls listed for a single source line if thereare multiple basic blocks that end on that line.  In this case, thebranches and calls are each given a number.  There is no simple way to mapthese branches and calls back to source constructs.  In general, though,the lowest numbered branch or call will correspond to the leftmost constructon the source line.For a branch, if it was executed at least once, then a percentageindicating the number of times the branch was taken divided by thenumber of times the branch was executed will be printed.  Otherwise, themessage ``never executed'' is printed.For a call, if it was executed at least once, then a percentageindicating the number of times the call returned divided by the numberof times the call was executed will be printed.  This will usually be100%, but may be less for functions that call @code{exit} or @code{longjmp},and thus may not return every time they are called.The execution counts are cumulative.  If the example program wereexecuted again without removing the @file{.gcda} file, the count for thenumber of times each line in the source was executed would be added tothe results of the previous run(s).  This is potentially useful inseveral ways.  For example, it could be used to accumulate data over anumber of program runs as part of a test verification suite, or toprovide more accurate long-term information over a large number ofprogram runs.The data in the @file{.gcda} files is saved immediately before the programexits.  For each source file compiled with @option{-fprofile-arcs}, theprofiling code first attempts to read in an existing @file{.gcda} file; ifthe file doesn't match the executable (differing number of basic blockcounts) it will ignore the contents of the file.  It then adds in thenew execution counts and finally writes the data to the file.@node Gcov and Optimization@section Using @command{gcov} with GCC OptimizationIf you plan to use @command{gcov} to help optimize your code, you mustfirst compile your program with two special GCC options:@samp{-fprofile-arcs -ftest-coverage}.  Aside from that, you can use anyother GCC options; but if you want to prove that every single linein your program was executed, you should not compile with optimizationat the same time.  On some machines the optimizer can eliminate somesimple code lines by combining them with other lines.  For example, codelike this:@smallexampleif (a != b)  c = 1;else  c = 0;@end smallexample@noindentcan be compiled into one instruction on some machines.  In this case,there is no way for @command{gcov} to calculate separate execution countsfor each line because there isn't separate code for each line.  Hencethe @command{gcov} output looks like this if you compiled the program withoptimization:@smallexample      100:   12:if (a != b)      100:   13:  c = 1;      100:   14:else      100:   15:  c = 0;@end smallexampleThe output shows that this block of code, combined by optimization,executed 100 times.  In one sense this result is correct, because therewas only one instruction representing all four of these lines.  However,the output does not indicate how many times the result was 0 and howmany times the result was 1.Inlineable functions can create unexpected line counts.  Line counts areshown for the source code of the inlineable function, but what is showndepends on where the function is inlined, or if it is not inlined at all.If the function is not inlined, the compiler must emit an out of linecopy of the function, in any object file that needs it.  If@file{fileA.o} and @file{fileB.o} both contain out of line bodies of aparticular inlineable function, they will also both contain coveragecounts for that function.  When @file{fileA.o} and @file{fileB.o} arelinked together, the linker will, on many systems, select one of thoseout of line bodies for all calls to that function, and remove or ignorethe other.  Unfortunately, it will not remove the coverage counters forthe unused function body.  Hence when instrumented, all but one use ofthat function will show zero counts.If the function is inlined in several places, the block structure ineach location might not be the same.  For instance, a condition mightnow be calculable at compile time in some instances.  Because thecoverage of all the uses of the inline function will be shown for thesame source lines, the line counts themselves might seem inconsistent.@c man end@node Gcov Data Files@section Brief description of @command{gcov} data files@command{gcov} uses two files for profiling.  The names of these filesare derived from the original @emph{object} file by substituting thefile suffix with either @file{.gcno}, or @file{.gcda}.  All of these filesare placed in the same directory as the object file, and contain datastored in a platform-independent format.The @file{.gcno} file is generated when the source file is compiled withthe GCC @option{-ftest-coverage} option.  It contains information toreconstruct the basic block graphs and assign source line numbers toblocks.The @file{.gcda} file is generated when a program containing object filesbuilt with the GCC @option{-fprofile-arcs} option is executed.  Aseparate @file{.gcda} file is created for each object file compiled withthis option.  It contains arc transition counts, and some summaryinformation.The full details of the file format is specified in @file{gcov-io.h},and functions provided in that header file should be used to access thecoverage files.@node Cross-profiling@section Data file relocation to support cross-profilingRunning the program will cause profile output to be generated.  For each source file compiled with @option{-fprofile-arcs}, an accompanying @file{.gcda} file will be placed in the object file directory. That implicitly requires running the program on the same system as it was built or having the same absolute directory structure on the target system. The program will tryto create the needed directory structure, if it is not already present.To support cross-profiling, a program compiled with @option{-fprofile-arcs}can relocate the data files based on two environment variables: @itemize @bullet@itemGCOV_PREFIX contains the prefix to add to the absolute paths in the object file. Prefix must be absolute as well, otherwise its value is ignored. The default is no prefix.@itemGCOV_PREFIX_STRIP indicates the how many initial directory names to strip offthe hardwired absolute paths. Default value is 0.@emph{Note:} GCOV_PREFIX_STRIP has no effect if GCOV_PREFIX is undefined, emptyor non-absolute.@end itemizeFor example, if the object file @file{/user/build/foo.o} was built with@option{-fprofile-arcs}, the final executable will try to create the data file@file{/user/build/foo.gcda} when running on the target system.  This willfail if the corresponding directory does not exist and it is unable to createit.  This can be overcome by, for example, setting the environment as@samp{GCOV_PREFIX=/target/run} and @samp{GCOV_PREFIX_STRIP=1}.  Such asetting will name the data file @file{/target/run/build/foo.gcda}.You must move the data files to the expected directory tree in order touse them for profile directed optimizations (@option{--use-profile}), or touse the @command{gcov} tool.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?