blob: 212c35a52e5cee30349949c328a818ca166d3d8a [file] [log] [blame]
<html lang="en">
<head>
<title>Compiling - GNU gprof</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="GNU gprof">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="prev" href="Introduction.html#Introduction" title="Introduction">
<link rel="next" href="Executing.html#Executing" title="Executing">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the gprof profiler of the GNU system.
Copyright (C) 1988-2019 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''.
-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
</head>
<body>
<div class="node">
<a name="Compiling"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Executing.html#Executing">Executing</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Introduction.html#Introduction">Introduction</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
<hr>
</div>
<h2 class="chapter">2 Compiling a Program for Profiling</h2>
<p>The first step in generating profile information for your program is
to compile and link it with profiling enabled.
<p>To compile a source file for profiling, specify the &lsquo;<samp><span class="samp">-pg</span></samp>&rsquo; option when
you run the compiler. (This is in addition to the options you normally
use.)
<p>To link the program for profiling, if you use a compiler such as <code>cc</code>
to do the linking, simply specify &lsquo;<samp><span class="samp">-pg</span></samp>&rsquo; in addition to your usual
options. The same option, &lsquo;<samp><span class="samp">-pg</span></samp>&rsquo;, alters either compilation or linking
to do what is necessary for profiling. Here are examples:
<pre class="example"> cc -g -c myprog.c utils.c -pg
cc -o myprog myprog.o utils.o -pg
</pre>
<p>The &lsquo;<samp><span class="samp">-pg</span></samp>&rsquo; option also works with a command that both compiles and links:
<pre class="example"> cc -o myprog myprog.c utils.c -g -pg
</pre>
<p>Note: The &lsquo;<samp><span class="samp">-pg</span></samp>&rsquo; option must be part of your compilation options
as well as your link options. If it is not then no call-graph data
will be gathered and when you run <code>gprof</code> you will get an error
message like this:
<pre class="example"> gprof: gmon.out file is missing call-graph data
</pre>
<p>If you add the &lsquo;<samp><span class="samp">-Q</span></samp>&rsquo; switch to suppress the printing of the call
graph data you will still be able to see the time samples:
<pre class="example"> Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
44.12 0.07 0.07 zazLoop
35.29 0.14 0.06 main
20.59 0.17 0.04 bazMillion
</pre>
<p>If you run the linker <code>ld</code> directly instead of through a compiler
such as <code>cc</code>, you may have to specify a profiling startup file
<samp><span class="file">gcrt0.o</span></samp> as the first input file instead of the usual startup
file <samp><span class="file">crt0.o</span></samp>. In addition, you would probably want to
specify the profiling C library, <samp><span class="file">libc_p.a</span></samp>, by writing
&lsquo;<samp><span class="samp">-lc_p</span></samp>&rsquo; instead of the usual &lsquo;<samp><span class="samp">-lc</span></samp>&rsquo;. This is not absolutely
necessary, but doing this gives you number-of-calls information for
standard library functions such as <code>read</code> and <code>open</code>. For
example:
<pre class="example"> ld -o myprog /lib/gcrt0.o myprog.o utils.o -lc_p
</pre>
<p>If you are running the program on a system which supports shared
libraries you may run into problems with the profiling support code in
a shared library being called before that library has been fully
initialised. This is usually detected by the program encountering a
segmentation fault as soon as it is run. The solution is to link
against a static version of the library containing the profiling
support code, which for <code>gcc</code> users can be done via the
&lsquo;<samp><span class="samp">-static</span></samp>&rsquo; or &lsquo;<samp><span class="samp">-static-libgcc</span></samp>&rsquo; command-line option. For
example:
<pre class="example"> gcc -g -pg -static-libgcc myprog.c utils.c -o myprog
</pre>
<p>If you compile only some of the modules of the program with &lsquo;<samp><span class="samp">-pg</span></samp>&rsquo;, you
can still profile the program, but you won't get complete information about
the modules that were compiled without &lsquo;<samp><span class="samp">-pg</span></samp>&rsquo;. The only information
you get for the functions in those modules is the total time spent in them;
there is no record of how many times they were called, or from where. This
will not affect the flat profile (except that the <code>calls</code> field for
the functions will be blank), but will greatly reduce the usefulness of the
call graph.
<p>If you wish to perform line-by-line profiling you should use the
<code>gcov</code> tool instead of <code>gprof</code>. See that tool's manual or
info pages for more details of how to do this.
<p>Note, older versions of <code>gcc</code> produce line-by-line profiling
information that works with <code>gprof</code> rather than <code>gcov</code> so
there is still support for displaying this kind of information in
<code>gprof</code>. See <a href="Line_002dby_002dline.html#Line_002dby_002dline">Line-by-line Profiling</a>.
<p>It also worth noting that <code>gcc</code> implements a
&lsquo;<samp><span class="samp">-finstrument-functions</span></samp>&rsquo; command-line option which will insert
calls to special user supplied instrumentation routines at the entry
and exit of every function in their program. This can be used to
implement an alternative profiling scheme.
</body></html>