Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

     Name
          lprof - display line-by-line execution count profile data

     Syntax
          lprof [-p] [-s] [-x] [[-I incdir]] [[-r srcfile]] [-c
          cntfile]
          lprof -m file1.cnt file2.cnt [[filen.cnt]] [-T] -d
          destfile.cnt

     Description
          lprof is a tool for dynamic analysis; that is, the analysis
          of a program at run time.  Specifically, lprof identifies
          the most frequently executed parts of source code and parts
          of code that are never executed.

          lprof interprets a profile file (prog.cnt by default)
          produced by the profiled program prog (a.out by default)
          that has been compiled with the -ql option of cc(CP).  This
          cc command option arranges for code to be inserted to record
          run-time behavior and for data to be written to a file at
          the end of execution.

          By default, lprof prints a listing of source files (the
          names of which are stored in the symbol table of the
          executable file), each line preceded by its line number (in
          the file) and the number of times it was executed.

          The following options may appear singly or be combined in
          any order:

          -p   Print listing, each line preceded by the line number
               and the number of times it was executed (default).
               This option can be used together with the -s option to
               print both the source listing and summary information.

          -s   Print summary information of percentage of lines of
               code executed per function.

          -x   Instead of printing the execution count numbers for
               each line, print each line preceded by its line number
               and a [U] if the line was not executed.  If the line
               was executed, print only the line number.

          -I incdir
               Look for source or header files in the directory incdir
               in addition to the current directory and the standard
               place for #include files (usually /usr/include).  You
               can specify more than one directory with -I on one
               command line.

          -r srcfile
               Instead of printing all source files, print only those
               files named in -r options (to be used with the -p
               option only).  You can specify multiple files with -r
               on one command line.

          -c cntfile
               Use the file cntfile instead of prog.cnt as the input
               profile file.

          -o prog
               Use the name of the program prog instead of the name
               used when creating the profile file.  Because the
               program name stored in the profile file contains the
               relative path, this option is necessary if the
               executable file or profile file has been moved.

        Merging Data Files
          lprof can also be used to merge data files.  The -m option
          must be accompanied with the -d option:

          -m file1.cnt file2.cnt [filen.cnt] -d destfile.cnt
               Merge the data files file1.cnt through filen.cnt by
               summing the execution counts per line, so that data
               from several runs can be accumulated.  The result is
               written to destfile.cnt.  The data files must contain
               profiling data for the same prog (see the -T option
               below).

          -T   Time stamp override.  Normally, the time stamps of the
               executable files being profiled are checked, and data
               files will not be merged if the time stamps do not
               match.  If -T is specified, this check is skipped.

        Controlling the Run Time Profiling Environment
          The environment variable PROFOPTS provides run time control
          over profiling.  When a profiled program is about to
          terminate, it examines the value of PROFOPTS to determine
          how the profiling data is to be handled.

          The environment variable PROFOPTS is a comma-separated list
          of options interpreted by the program being profiled.  If
          PROFOPTS is not defined in the environment, then the default
          action is taken: the profiling data is saved in a file (with
          the default name, prog.cnt) in the current directory.  If
          PROFOPTS is set to the null string, no profiling data is
          saved.  The following are the available options:

          msg=[y|n]
               If msg=y is specified, a message stating that profile
               data is being saved is printed to stderr.  If msg=n is
               specified, print only profiling error messages.  The
               default is msg=y.

          merge=[y|n]
               If merge=n is specified, do not merge data files after
               successive runs.  The data file is overwritten after
               each execution.  If merge=y is specified, the data will
               be merged.  The merge will fail if the program has been
               recompiled; the data file will be left in TMPDIR.  The
               default is merge=n.

          pid=[y|n]
               If pid=y is specified, the name of the data file will
               include the process ID of the profiled program.  This
               allows the creation of different data files for
               programs calling fork(S).  If pid=n is specified, the
               default name is used.  The default is pid=n.

          dir=dirname
               Place the data file in the directory dirname if this
               option is specified.  Otherwise, the data file is
               created in the directory that is current at the end of
               execution.

          file=filename
               Use filename as the name of the data file in dir
               created by the profiled program if this option is
               specified.  Otherwise, the default name is used.

     Files
          prog.cnt    for profile data
          TMPDIR/*    temporary files

                      TMPDIR is usually /usr/tmp, but can be redefined
                      by setting the environment variable TMPDIR [see
                      tempnam() in tmpnam(S)].
     See Also
          cc(CP), prof(CP), fork(S), tmpnam(S)
     Warnings
          For the -m option, if destfile.cnt exists, its previous
          contents are destroyed.
          Optimizing functions may result in the loss of some line
          number information and may result in code motions, both of
          which may make lprof information unreliable.
          Different parts of one line of a source file may be executed
          different numbers of times (e.g., the for loop below); the
          count corresponds to the first part of the line.  For
          example, in the following for loop:
               1 [8]  for (j = 0; j < 5; j++)
               5 [9]     sub(j);
          line 8 consists of three parts.  The line count listed,
          however, is for the initialization part, that is, j = 0.
          lprof incorrectly handles the statement immediately
          following a for loop containing a single if statement.  In
          the following example, line 8 is executed only once.
               1 [5]  for (i = 0; i < 3; i++)
               3 [6]     if (i > 3)
               0 [7]        x = i;
               3 [8]  i = 0;
          This problem can be solved by adding curly braces, as
          follows:
               1 [5]  for (i = 0; i < 3; i++) {
               3 [6]     if (i > 3)
               0 [7]        x = i;
               3 [8]  }
               1 [9]  i = 0;
          lprof then handles the statement following the for loop
          correctly.
          lprof does not provide execution information about case
          statements containing only a break statement, or about
          return statements without a value.
               1 [4]  switch (i) {
                         case 0:
                           break;
                         default:
               0 [8]       i = 0;
                      }
               1 [11] if (i != 0)
                         return;
                                                (printed 6/18/89)



Typewritten Software • bear@typewritten.org • Edmonds, WA 98026