gprof [ -[abcDhilLrsTvwxyz] ] [ -[ACeEfFJnNOpPqQZ][name] ] [ -I dirs ] [ -d[num] ] [ -k from/to ] [ -m min-count ] [ -R map_file ] [ -t table-length ] [ --[no-]annotated-source[=name] ] [ --[no-]exec-counts[=name] ] [ --[no-]flat-profile[=name] ] [ --[no-]graph[=name] ] [ --[no-]time=name] [ --all-lines ] [ --brief ] [ --debug[=level] ] [ --function-ordering ] [ --file-ordering map_file ] [ --directory-path=dirs ] [ --display-unused-functions ] [ --file-format=name ] [ --file-info ] [ --help ] [ --line ] [ --inline-file-names ] [ --min-count=n ] [ --no-static ] [ --print-path ] [ --separate-files ] [ --static-call-graph ] [ --sum ] [ --table-length=len ] [ --traditional ] [ --version ] [ --width=n ] [ --ignore-non-functions ] [ --demangle[=STYLE] ] [ --no-demangle ] [--external-symbol-table=name] [ image-file ] [ profile-file ... ]
"gprof" produces an execution profile of C, Pascal, or Fortran77 programs. The effect of called routines is incorporated in the profile of each caller. The profile data is taken from the call graph profile file (gmon.out default) which is created by programs that are compiled with the -pg option of "cc", "pc", and "f77". The -pg option also links in versions of the library routines that are compiled for profiling. "Gprof" reads the given object file (the default is "a.out") and establishes the relation between its symbol table and the call graph profile from gmon.out. If more than one profile file is specified, the "gprof" output shows the sum of the profile information in the given profile files.
If you use gcc 2.95.x or 3.0 to compile your binaries, you may need to add the -fprofile-arcs to the compile command line in order for the call graphs to be properly stored in gmon.out.
"Gprof" calculates the amount of time spent in each routine. Next, these times are propagated along the edges of the call graph. Cycles are discovered, and calls into a cycle are made to share the time of the cycle.
Several forms of output are available from the analysis.
The flat profile shows how much time your program spent in each function, and how many times that function was called. If you simply want to know which functions burn most of the cycles, it is stated concisely here.
The call graph shows, for each function, which functions called it, which other functions it called, and how many times. There is also an estimate of how much time was spent in the subroutines of each function. This can suggest places where you might try to eliminate function calls that use a lot of time.
The annotated source listing is a copy of the program's source code, labeled with the number of times each line of the program was executed.
These options specify which of several output formats "gprof" should produce.
Many of these options take an optional symspec to specify functions to be included or excluded. These options can be specified multiple times, with different symspecs, to include or exclude sets of symbols.
Specifying any of these options overrides the default (-p -q), which prints a flat profile and call graph analysis for all functions.
If the profile data file contains basic-block count records, specifying the -l option, along with -C, will cause basic-block execution counts to be tallied and displayed.
The exact details of how to force the linker to place functions in a particular order is system dependent and out of the scope of this manual.
Use of the -a argument is highly recommended with this option.
The map_file argument is a pathname to a file which provides function name to object file mappings. The format of the file is similar to the output of the program "nm".
c-parse.o:00000000 T yyparse c-parse.o:00000004 C yyerrflag c-lang.o:00000000 T maybe_objc_method_name c-lang.o:00000000 T print_lang_statistics c-lang.o:00000000 T recognize_objc_keyword c-decl.o:00000000 T print_lang_identifier c-decl.o:00000000 T print_lang_type ...
To create a map_file with GNU "nm", type a command like "nm --extern-only --defined-only -v --print-file-name program-name".
If the program was compiled with basic-block counting enabled, this option will also identify how many times each line of code was executed. While line-by-line profiling can help isolate where in a large function a program is spending its time, it also significantly increases the running time of "gprof", and magnifies statistical inaccuracies.
Eventually you can run "gprof" again without -s to analyze the cumulative data in the file gmon.sum.
The granularity of the sampling is shown, but remains statistical at best. We assume that the time for each execution of a function can be expressed by the total time for the function divided by the number of times the function is called. Thus the time propagated along the call graph arcs to the function's parents is directly proportional to the number of times that arc is traversed.
Parents that are not themselves profiled will have the time of their profiled children propagated to them, but they will appear to be spontaneously invoked in the call graph listing, and will not have their time propagated further. Similarly, signal catchers, even though profiled, will appear to be spontaneous (although for more obscure reasons). Any profiled children of signal catchers should have their times propagated properly, unless the signal catcher was invoked during the execution of the profiling routine, in which case all is lost.
The profiled program must call "exit"(2) or return normally for the profiling information to be saved in the gmon.out file.
cc(1), prof(1), and the Info entry for gprof.
``An Execution Profiler for Modular Programs'', by S. Graham, P. Kessler, M. McKusick; Software - Practice and Experience, Vol. 13, pp. 671-685, 1983.
``gprof: A Call Graph Execution Profiler'', by S. Graham, P. Kessler, M. McKusick; Proceedings of the SIGPLAN '82 Symposium on Compiler Construction, SIGPLAN Notices, Vol. 17, No 6, pp. 120-126, June 1982.
Copyright (c) 1988-2017 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''.