Call Path Profile Probe

From OC Systems Wiki!
Revision as of 20:31, 27 April 2021 by Swn (talk | contribs) (Call Path Profile Probe: callpp.ual)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search


Call Path Profile Probe: callpp.ual

(Since 4.5.4).

The callpp.ual predefined probe is useful for racking the performance of calls based on their call paths (tracebacks).

This probe works by tracking the time spent in all the call paths (tracebacks) to the specified functions. From this information you can determine which call paths cause the slowest executions of specified functions.

See also Call Graph Profile.

Usage

This probe is applied at run time using aprobe as described under Call Paths Profile UAL Parameters below. Profiling data will be collected for the functions specified int he probe configuration file.

Call Path Profile UAL Parameters

callpp.ual is specified on the aprobe command line or in an APO file as described in Command Line. The specific options are:

aprobe  -u callpp.ual    [-p "param-list"] your_program

where param_list may include:

-d Depth
traceback depth [9]
-i
print tracebacks in tables
-m
Use MONOTONIC clock instead of CPU clock (implies -x)
-r
reset statistics after each snapshot


Call Path Profile Configuration File

The Call Path PROFILE configuration file is used to specify what subprograms are to be analyzed, when snapshots are to be taken, and other options, as described in Configuration File. The example below shows one possible CALL PATH profile configuration file.

 
 PROBE CONFIGURATION FILE FOR CALLPP VERSION 1.0.0
 
 TracebackDepth 9
 ResetSnapshotCounts TRUE
  
 // Here we select which subprograms we want to profile:
 PROBE "main"
 PROBE extern:"YET_ANOTHER_LOCAL_PROC"
 PROBE "STILL_ANOTHER_LOCAL_PROC"
 REMOVE "don't-profile-me"

 // Here we define which subprogram invocations cause snapshots
 // to be saved.
 SNAPSHOT "printf" IN "libc.a(shr.o)" ON ENTRY IS "printf called"

Note that if you do not provide a configuration file, the probe will create a default configuration file for you. This is a good way to get started.

Configuration Variables

The following are the only valid keywords that identify lines to set configuration variables. Each such line must begin with one of these keywords, and the keyword must be followed by a value. Nothing else is allowed on the same line.

TracebackDepth

This must be followed by an positive value. The default is 9.

ResetSnapshotCounts

This must be followed by TRUE or FALSE. The default is FALSE. When FALSE, the data from all intermediate snapshots accumulate into the one final report. When TRUE the counts are reset for each separate snapshot.

Configuration of Profile Functions

Each function for which call path profile data is to be collected must be specified explicitly using the PROBE keyword.

The PROBE keyword is followed by the name of the function, as described in Configuration of Selected Functions. This directive selects specific functions by name (with possible wildcards).

By default, if no PROBE lines exist, then coverage data will only be collected for the "main()" function of the application module.

The REMOVE keyword allows you to specify subprograms that should not be instrumented for logging call path profile data. This is useful when used in conjunction with a wildcard ("*"), to gather data about everything except certain routines.

Note: PROBE "*" is not a particuarly useful concept since it is important for you to identify and isolate your functions carefully in order to use call path profile for its intended purpose.

Configuration of Snapshots

The call path profile probe configuration file allows you to specify the name of some subprograms for which snapshots of the profile data are to be automatically taken. This is done with lines beginning with the keyword SNAPSHOT.

Each SNAPSHOT line must specify a particular subprogram in the usual manner, just as is done for a PROBE line.

The remainder of the SNAPSHOT line contains pairs, where each pair has a special identifier keyword followed by its own associated value. These pairs give supplementary information about the snapshot.

  • ON - This optional special identifier must be followed by the value ENTRY or EXIT, to denote that the snapshot is to be taken on entry to or exit from the subprogram respectively.
  • IS - This optional special identifier must be followed by an (arbitrarily long) string enclosed within quotation marks (""). It specifies a textual description or title that is to be logged along with the snapshot.


Call Path Profile Report

The following is an example report for call path profile. This simple example profiled the rand() function as called from several locations in the application program.

Snapshots are taken on the exit from two different functions as well as the one on program exit.

Tracebacks are not reported in the tables, but are listed at the end of the report.

This is the configuration file:

PROBE CONFIGURATION FILE FOR CALLPP VERSION 1.0.0

PROBE "rand()" in "libc.so"

SNAPSHOT "f1()" ON EXIT
SNAPSHOT "f2()" ON EXIT IS "on exit from f2()"

This is the report:

callpp.ual: : Starting format...
Call Path Profile Probe 4.5.3 (210311)
Copyright 1993-2021 OC Systems, Inc. All rights reserved.
For support/questions send mail to support@ocsystems.com.

PID: 1347636 - Summary of options
   Program start: Thu Apr  8 14:21:30.565365 2021
Options:
   TracebackDepth:   9



Snapshot: Snapshot on exit from f1()

--------------------------------------------------------------
Call paths sorted by time:
--------------------------------------------------------------
TbkId | NumCalls | TotalWallTime |   AvgWallTime  |  MaxWallTime  | TotalCpuTime |    AvgCpuTime  |   MaxCpuTime
--------------------------------------------------------------
@1    	       20	0.000074	0.000004	0.000017	0.000000	0.000000	0.000000
@10   	        9	0.000027	0.000003	0.000003	0.000000	0.000000	0.000000
@9    	        8	0.000024	0.000003	0.000003	0.000000	0.000000	0.000000
@8    	        7	0.000021	0.000003	0.000003	0.000000	0.000000	0.000000
@7    	        6	0.000018	0.000003	0.000003	0.000000	0.000000	0.000000
@6    	        5	0.000015	0.000003	0.000003	0.000000	0.000000	0.000000
@5    	        4	0.000012	0.000003	0.000003	0.000000	0.000000	0.000000
@4    	        3	0.000009	0.000003	0.000003	0.000000	0.000000	0.000000
@3    	        2	0.000007	0.000003	0.000003	0.000000	0.000000	0.000000
@2    	        1	0.000004	0.000004	0.000004	0.000000	0.000000	0.000000
--------------------------------------------------------------
Call paths sorted by count:
--------------------------------------------------------------
TbkId | NumCalls | TotalWallTime |   AvgWallTime  |  MaxWallTime  | TotalCpuTime |    AvgCpuTime  |   MaxCpuTime
--------------------------------------------------------------
@1    	       20	0.000074	0.000004	0.000017	0.000000	0.000000	0.000000
@10   	        9	0.000027	0.000003	0.000003	0.000000	0.000000	0.000000
@9    	        8	0.000024	0.000003	0.000003	0.000000	0.000000	0.000000
@8    	        7	0.000021	0.000003	0.000003	0.000000	0.000000	0.000000
@7    	        6	0.000018	0.000003	0.000003	0.000000	0.000000	0.000000
@6    	        5	0.000015	0.000003	0.000003	0.000000	0.000000	0.000000
@5    	        4	0.000012	0.000003	0.000003	0.000000	0.000000	0.000000
@4    	        3	0.000009	0.000003	0.000003	0.000000	0.000000	0.000000
@3    	        2	0.000007	0.000003	0.000003	0.000000	0.000000	0.000000
@2    	        1	0.000004	0.000004	0.000004	0.000000	0.000000	0.000000
---------------------------------------------------------
CallPaths traceback ids:
---------------------------------------------------------
@1             20   0.000074   0.000017   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 17 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@2              1   0.000004   0.000004   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 8 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@3              2   0.000007   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 9 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@4              3   0.000009   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 10 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@5              4   0.000012   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 11 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@6              5   0.000015   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 12 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@7              6   0.000018   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 13 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@10             9   0.000027   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 16 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@9              8   0.000024   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 15 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@8              7   0.000021   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 14 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098



Snapshot: on exit from f2()

--------------------------------------------------------------
Call paths sorted by time:
--------------------------------------------------------------
TbkId | NumCalls | TotalWallTime |   AvgWallTime  |  MaxWallTime  | TotalCpuTime |    AvgCpuTime  |   MaxCpuTime
--------------------------------------------------------------
@11   	       20	0.000061	0.000003	0.000003	0.000000	0.000000	0.000000
@20   	        9	0.000028	0.000003	0.000003	0.000000	0.000000	0.000000
@19   	        8	0.000025	0.000003	0.000003	0.000000	0.000000	0.000000
@18   	        7	0.000021	0.000003	0.000003	0.000000	0.000000	0.000000
@17   	        6	0.000018	0.000003	0.000003	0.000000	0.000000	0.000000
@16   	        5	0.000015	0.000003	0.000003	0.000000	0.000000	0.000000
@15   	        4	0.000012	0.000003	0.000003	0.000000	0.000000	0.000000
@14   	        3	0.000009	0.000003	0.000003	0.000000	0.000000	0.000000
@13   	        2	0.000006	0.000003	0.000003	0.000000	0.000000	0.000000
@12   	        1	0.000003	0.000003	0.000003	0.000000	0.000000	0.000000
@1    	        0
@3    	        0
@8    	        0
@2    	        0
@4    	        0
@5    	        0
@6    	        0
@7    	        0
@10   	        0
@9    	        0
--------------------------------------------------------------
Call paths sorted by count:
--------------------------------------------------------------
TbkId | NumCalls | TotalWallTime |   AvgWallTime  |  MaxWallTime  | TotalCpuTime |    AvgCpuTime  |   MaxCpuTime
--------------------------------------------------------------
@11   	       20	0.000061	0.000003	0.000003	0.000000	0.000000	0.000000
@20   	        9	0.000028	0.000003	0.000003	0.000000	0.000000	0.000000
@19   	        8	0.000025	0.000003	0.000003	0.000000	0.000000	0.000000
@18   	        7	0.000021	0.000003	0.000003	0.000000	0.000000	0.000000
@17   	        6	0.000018	0.000003	0.000003	0.000000	0.000000	0.000000
@16   	        5	0.000015	0.000003	0.000003	0.000000	0.000000	0.000000
@15   	        4	0.000012	0.000003	0.000003	0.000000	0.000000	0.000000
@14   	        3	0.000009	0.000003	0.000003	0.000000	0.000000	0.000000
@13   	        2	0.000006	0.000003	0.000003	0.000000	0.000000	0.000000
@12   	        1	0.000003	0.000003	0.000003	0.000000	0.000000	0.000000
@1    	        0
@9    	        0
@3    	        0
@8    	        0
@2    	        0
@4    	        0
@5    	        0
@6    	        0
@7    	        0
@10   	        0
---------------------------------------------------------
CallPaths traceback ids:
---------------------------------------------------------
@11            20   0.000061   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 17 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@12             1   0.000003   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 8 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@13             2   0.000006   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 9 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@14             3   0.000009   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 10 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@15             4   0.000012   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 11 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@16             5   0.000015   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 12 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@17             6   0.000018   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 13 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@1              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 17 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@18             7   0.000021   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 14 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@2              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 8 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@19             8   0.000025   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 15 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@3              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 9 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@20             9   0.000028   0.000003   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 16 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@4              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 10 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@5              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 11 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@6              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 12 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@7              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 13 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@10             0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 16 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@9              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 15 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@8              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 14 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098



Snapshot: End of Program

--------------------------------------------------------------
Call paths sorted by time:
--------------------------------------------------------------
TbkId | NumCalls | TotalWallTime |   AvgWallTime  |  MaxWallTime  | TotalCpuTime |    AvgCpuTime  |   MaxCpuTime
--------------------------------------------------------------
@12   	        0
@13   	        0
@14   	        0
@15   	        0
@16   	        0
@17   	        0
@1    	        0
@18   	        0
@2    	        0
@11   	        0
@19   	        0
@8    	        0
@3    	        0
@20   	        0
@4    	        0
@5    	        0
@6    	        0
@7    	        0
@10   	        0
@9    	        0
--------------------------------------------------------------
Call paths sorted by count:
--------------------------------------------------------------
TbkId | NumCalls | TotalWallTime |   AvgWallTime  |  MaxWallTime  | TotalCpuTime |    AvgCpuTime  |   MaxCpuTime
--------------------------------------------------------------
@13   	        0
@14   	        0
@15   	        0
@16   	        0
@17   	        0
@1    	        0
@18   	        0
@2    	        0
@11   	        0
@12   	        0
@19   	        0
@9    	        0
@8    	        0
@3    	        0
@20   	        0
@4    	        0
@5    	        0
@6    	        0
@7    	        0
@10   	        0
---------------------------------------------------------
CallPaths traceback ids:
---------------------------------------------------------
@11             0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 17 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@12             0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 8 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@13             0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 9 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@14             0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 10 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@15             0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 11 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@16             0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 12 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@17             0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 13 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@1              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 17 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@18             0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 14 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@2              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 8 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@19             0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 15 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@3              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 9 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@20             0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 16 (main.c)
     ==> extern:"f2()" at line 39 (main.c)
     ==> extern:"main()" at line 47 (main.c)
     ==> extern:"__start()" + 0x0098

@4              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 10 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@5              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 11 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@6              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 12 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@7              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 13 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@10             0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 16 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@9              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 15 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098

@8              0   0.000000   0.000000   0.000000   0.000000

         extern:"rand()" in "libc.a(shr.o)"
     ==> extern:"func()" at line 14 (main.c)
     ==> extern:"f1()" at line 28 (main.c)
     ==> extern:"main()" at line 46 (main.c)
     ==> extern:"__start()" + 0x0098