The prof command interprets a profile file produced by the monitor function. The symbol table in the object file prog (a.out by default) is read and correlated with a profile file (mon.out by default). For each external text symbol the percentage of time spent executing between the address of that symbol and the address of the next is printed, together with the number of times that function was called and the average number of milliseconds per call.
The mutually exclusive options -o and -x specify the printing of the address of each symbol monitored:
The mutually exclusive options -g and -l control the type of symbols to be reported. The -l option must be used with care; it applies the time spent in a static function to the preceding (in memory) global function, instead of giving the static function a separate entry in the report. If all static functions are properly located (see example below), this feature can be very useful. If not, the resulting report may be misleading.
Assume that A and B are global functions and only A calls static function S. If S is located immediately after A in the source code (that is, if S is properly located), then, with the -l option, the amount of time spent in A can easily be determined, including the time spent in S. If, however, both A and B call S, then, if the -l option is used, the report will be misleading; the time spent during B’s call to S will be attributed to A, making it appear as if more time had been spent in A than really had. In this case, function S cannot be properly located.
The following options may be used in any combination:
A program creates a profile file if it has been link edited with the -p option of cc(1B) . This option to the cc(1B) command arranges for calls to monitor at the beginning and end of execution. It is the call to monitor at the end of execution that causes the system to write a profile file. The number of calls to a function is tallied if the -p option was used when the file containing the function was compiled.
A single function may be split into subfunctions for profiling by means of the MARK macro (see prof(5) ).
The lprof section in
Only programs that call exit or return from main are guaranteed to produce a profile file, unless a final call to monitor is explicitly coded.
The times for static functions are attributed to the preceding external text symbol if the -g option is not used. However, the call counts for the preceding function are still correct; that is, the static function call counts are not added to the call counts of the external function.
If more than one of the options -t,
-c, -a, and -n is specified, the last option specified is used and the user
is warned.
Profiling may be used with dynamically linked executables, but care must be applied. Currently, shared objects cannot be profiled with prof. Thus, when a profiled, dynamically linked program is executed, only the ‘‘main’’ portion of the image is sampled. This means that all time spent outside of the ‘‘main’’ object, that is, time spent in a shared object, will not be included in the profile summary; the total time reported for the program may be less than the total time used by the program.
Because the time spent in a shared object cannot be accounted for, the use of shared objects should be minimized whenever a program is profiled with prof. If desired, the program should be linked to the profiled version of a library (or to the standard archive version if no profiling version is available), instead of the shared object to get profile information on the functions of a library. Versions of profiled libraries may be supplied with the system in the /usr/lib/libp directory. Refer to compiler driver documentation on profiling.
Consider an extreme case. A profiled program dynamically linked with the shared C library spends 100 units of time in some libc routine, say, malloc(). Suppose malloc() is called only from routine B " and " B consumes only 1 unit of time. Suppose further that routine A consumes 10 units of time, more than any other routine in the ‘‘main’’ (profiled) portion of the image. In this case, prof will conclude that most of the time is being spent in A and almost no time is being spent in B. From this it will be almost impossible to tell that the greatest improvement can be made by looking at routine B and not routine A. The value of the profiler in this case is severely degraded; the solution is to use archives as much as possible for profiling.