Annotation of pmsdk/profiler/profile.doc, revision 1.1.1.2

1.1       root        1:  
                      2: 
                      3:        OS/2 Profiler
                      4: ------------------------------------------------------------
                      5: 
1.1.1.2 ! root        6: The OS/2 Profiler allows you to determine where your programs
1.1       root        7: are spending their time. It will tell you the percentage of execution 
                      8: time spent in your program at a function level when used with a .MAP 
                      9: file. It will also show what percentage of execution time is being used
                     10: by the system.
                     11: 
                     12: IMPORTANT NOTE: The profiling programming interfaces and tools are
1.1.1.2 ! root       13: provided here in the Microsoft OS/2 1.1 Software Development Kit as an
1.1       root       14: aid to developers. These features will NOT be present in the
                     15: end-user version of the product. If you insert the profiling calls
                     16: into your code during development you must remove them in your
                     17: final code otherwise your application will fail to load on the
                     18: retail end user system. In addition we will change and improve
                     19: these calls over time and future versions may not be compatible
                     20: with those in the current kit. These calls are not part of the
                     21: standard MS OS/2 Application Programming Interface.
1.1.1.2 ! root       22: 
        !            23: The profiling tools requires a special kernel called OS2KRNLP (we have also
        !            24: included a version of this kernel for PS/2s:  OS2KRNLP.PS2).  To use 
        !            25: these tools remove the HIDDEN and READ ONLY permission from the retail kernel 
        !            26: (using the Toolkit tool Chmode like this: chmode -hr OS2KRNL), and then
        !            27: copy the retail kernel to OS2KRNLR.  Next, copy the appropriate profiling
        !            28: kernel (OS2KRNLP or OS2KRNLP.PS2) to OS2KRNL and reboot.  The special kernel
        !            29: is a super set of the retail kernel so it can be used in the same way as the
        !            30: retail kernel.
        !            31: 
1.1       root       32: 
                     33: Profile Library Calls:
                     34: ======================
                     35: 
                     36: 
                     37: -----------------------------
                     38: ProfInit( type, modulelist);
                     39:    int     type;            /* type = 0      system              */
                     40:                             /*      = 5      PT_USER|PT_USEKP    */
                     41:    char far *modulelist;     /* should be NULL for user profiling */
                     42: 
                     43: ProfInit() initializes internal data space.
                     44: 
1.1.1.2 ! root       45: ProfInit clears the data areas after it has allocated them. In 
1.1       root       46: addition to the profiling coutner segments, the profiler allocates a 64K
                     47: block for internal use. 
                     48: 
                     49: 
                     50: ------------------------------
                     51: ProfOn( type);
                     52:    int type;           /* type = system or user (0/1) */
                     53: 
                     54: ProfOn() starts the counters.
                     55: 
                     56: 
                     57: ------------------------------
                     58: ProfOff( type);
                     59:    int type;           /* type = system or user (0/1) */
                     60: 
                     61: ProfOff() stops the counters.
                     62: 
                     63: 
                     64: ------------------------------
                     65: ProfDump( type, filename);
                     66:    int type;           /* type = system or user (0/1) */
                     67:    char far *filename;  /* long pointer to ASCIIZ filename */
                     68: 
                     69: 
                     70: ProfDump() dumps the profiling information to the specified filename.
                     71: The file is used later as input for the profiling utility PINFO.EXE
                     72: which displays the usage statistics.
                     73: 
                     74: ------------------------------
                     75: ProfFree( type);
                     76:    int type;           /* type = system or user (0/1) */
                     77: 
                     78: ProfFree() is the final call in a profiling session. ProfFree frees
                     79: all memory used by the profiling data segments and data allocated 
                     80: for internal use.
                     81: 
                     82: 
                     83: ------------------------------
                     84: ProfClear( type);
                     85:    int type;           /* type = system or user (0/1) */
                     86: 
                     87: ProfClear() Clears all counters. 
                     88: 
                     89: 
                     90: 
                     91: 
                     92: To use the profiler follow these steps:
                     93: ---------------------------------------
                     94: 
                     95: 1>  a. Copy PINFO.EXE and PSET.EXE into a directory on your path.
                     96:     b. Put PROFILE.DLL in a directory in your LIBPATH.
                     97: 
                     98: 
                     99:    USER PROFILING
                    100:    --------------
                    101: 
1.1.1.2 ! root      102: 2> a. Get testprof.c, testprof.def, testprof.lrf, profile.h and profile.lib
        !           103:       from the profiler\example, include, lib directories to use as an 
        !           104:       example.
        !           105:    b. Insert calls to the profiling functions in your application,
        !           106:       using testprof.c as a model.
1.1       root      107:    c. Build your executable.
                    108:    d. Run your executable.
1.1.1.2 ! root      109:    e. use PINFO to display profiling results   
1.1       root      110: 
                    111:    SYSTEM PROFILING
                    112:    ----------------
1.1.1.2 ! root      113: 3> a. Make a batch file with the following lines:
1.1       root      114:         pset init
                    115:         pset on
                    116:         (your commands here...)
                    117:         pset off
                    118:         pset dump (your filename)
                    119:         pset free
                    120:    b. Run the batch file.
                    121: 
1.1.1.2 ! root      122: 4>  Using PINFO.EXE with dump files
1.1       root      123: 
                    124: 
                    125: (Your results may be different than this example.)
                    126: 
                    127:     Example 1. "pinfo testprof.pro"
                    128: 
                    129:                Module    Segment  Length  Tics      Percent
                    130:                --------  -------  ------  --------  -------
                    131:                kernel                            9    1.88
                    132:                TESTPROF    0001    182c        470   98.12
                    133:                                           --------
                    134:                                   Total        479
                    135: 
                    136:     Example 2. "pinfo testprof.pro testprof.map"
                    137: 
                    138:                Module TESTPROF
                    139: 
                    140:                Segment 1:
                    141:                0001:003e          6 (  1.25%)   _main
                    142:                0001:0128        464 ( 96.87%)   _inner
                    143: 
                    144:     NOTE: pinfo extracts data on the segments belonging to the module
                    145:           represented in the map file.
                    146: 
                    147: 
                    148: PINFO.EXE   (NOTE: OS/2 Protected mode only)
                    149: ---------
                    150: USAGE: pinfo [-etz] dump_file [ [-f] file]
                    151:          -e : print every tic count (subject to -z)
                    152:         -t : print totals for each segment (subject to -z)
                    153:          -z : print 0 counts
                    154:    dump_file: output of ProfDump() API;
                    155:         file: map file to correlate with dump file
                    156:      -f file: file is list of map files to correlate with dump file,
                    157:                file names listed one per line.
                    158: 
                    159:        (See above examples)
                    160: 
                    161: PSET.EXE    (NOTE: OS/2 Protected mode only)
                    162: --------
                    163: USAGE: pset INIT | CLEAR | ON | OFF | DUMP file | FREE
                    164:    CLEAR      reset counts to zero
                    165:    DUMP file  dump profile data to <file>
                    166:    FREE       deallocate system profiling data space
                    167:    INIT       allocate system profiling data space
                    168:    OFF        turn off profiling
                    169:    ON         turn on profiling
                    170: 
                    171:        (See the Profile Library function descriptions for further
                    172:                detail.)
                    173: 
                    174: 
                    175: Misc. Info
                    176: ----------
                    177: 
                    178: ProfInit() initializes the segment selector table used to determine later
                    179: if the interrupted CS has a corresponding data area and then allocates
                    180: the data areas. For each CS in the LDT, a parallel data segment is
                    181: allocated with the same size as the CS. The IP from the IRET frame
                    182: has the lower two bits masked off for DWORD resolution and is then used 
                    183: as an offset into this data segment to increment a DWORD. This gives
                    184: a profiling granularity of a DWORD. The overhead of the profiler is
                    185: less than 5% of non-profiling execution. 
                    186: 
                    187: 
                    188: The profiler uses Timer 0 of the 8243 Timer Chip. Any applications that
                    189: use this timer will not profile correctly. 
                    190: 
                    191: Real mode profiling is NOT supported. Since real mode uses Timer 0 for
                    192: other things, real mode should not be used.
                    193: 
                    194: The profiler supports nested calls to ProfOn() and ProfOff(). There must
                    195: be a matching ProfOff() call for every ProfOn() call.
                    196: 
                    197: 
                    198: 
                    199: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.