#include <sys/gmon.h>
sys/gmon.h
structgmonhdr
Structure prepended to gmon.out profiling data file.
| uint32_t | lpc | base pc address of sample buffer |
| uint32_t | hpc | max pc address of sampled buffer |
| uint32_t | ncnt | size of sample buffer (plus this header) |
| int32_t | version | version number |
| int32_t | profrate | profiling clock rate |
| int32_t[3] | spare | reserved |
macroGMONVERSION
#define GMONVERSION 0x00051879
structgmonhdr_64
| uint64_t | lpc | base pc address of sample buffer |
| uint64_t | hpc | max pc address of sampled buffer |
| uint32_t | ncnt | size of sample buffer (plus this header) |
| int32_t | version | version number |
| int32_t | profrate | profiling clock rate |
| int32_t[3] | spare | reserved |
typedefgmonhdr_t
typedef struct gmonhdr_64 gmonhdr_t;
macroHISTCOUNTER
histogram counters are unsigned shorts (according to the kernel).
#define HISTCOUNTER unsigned short
macroHISTFRACTION
fraction of text space to allocate for histogram counters here, 1/2
#define HISTFRACTION 2
macroHASHFRACTION
Fraction of text space to allocate for from hash buckets.
The value of HASHFRACTION is based on the minimum number of bytes
of separation between two subroutine call points in the object code.
Given MIN_SUBR_SEPARATION bytes of separation the value of
HASHFRACTION is calculated as:
HASHFRACTION = MIN_SUBR_SEPARATION / (2 * sizeof(short) - 1);
For example, on the VAX, the shortest two call sequence is:
calls $0,(r0)
calls $0,(r0)
which is separated by only three bytes, thus HASHFRACTION is
calculated as:
HASHFRACTION = 3 / (2 * 2 - 1) = 1
Note that the division above rounds down, thus if MIN_SUBR_FRACTION
is less than three, this algorithm will not work!
In practice, however, call instructions are rarely at a minimal
distance. Hence, we will define HASHFRACTION to be 2 across all
architectures. This saves a reasonable amount of space for
profiling data structures without (in practice) sacrificing
any granularity.
#define HASHFRACTION 2
macroMINARCS
#define MINARCS 50
macroMAXARCS
#define MAXARCS ((1 << (8 * sizeof(HISTCOUNTER))) - 2)
structtostruct_64
| uint64_t | selfpc | |
| int32_t | count | |
| uint16_t | link | |
| uint16_t | order |
typedeftostruct_t
typedef struct tostruct_64 tostruct_t;
structrawarc
a raw arc, with pointers to the calling site and
the called site and a count.
| uint32_t | raw_frompc | |
| uint32_t | raw_selfpc | |
| int32_t | raw_count |
macroROUNDUP
#define ROUNDUP(x, y) ((((x)+(y)-1)/(y))*(y))
structgmonparam
The profiling data structures are housed in this structure.
| int | state | |
| u_short * | kcount | |
| u_long | kcountsize | |
| u_short * | froms | |
| u_long | fromssize | |
| tostruct_t * | tos | |
| u_long | tossize | |
| long | tolimit | |
| u_long | lowpc | |
| u_long | highpc | |
| u_long | textsize | |
| u_long | hashfraction |
variable_gmonparam
extern struct gmonparam _gmonparam
macroGMON_PROF_BUSY
#define GMON_PROF_BUSY 1
macroGMON_PROF_ERROR
#define GMON_PROF_ERROR 2
macroGMON_PROF_OFF
#define GMON_PROF_OFF 3
macroGMON_MAGIC
In order to support more information than in the original mon.out and
gmon.out files there is an alternate gmon.out file format. The alternate
gmon.out file format starts with a magic number then separates the
information with gmon_data_t's.
#define GMON_MAGIC 0xbeefbabe
macroGMON_MAGIC_64
#define GMON_MAGIC_64 0xbeefbabf
structgmon_data
| uint32_t | type | constant for type of data following this struct |
| uint32_t | size | size in bytes of the data following this struct |
typedefgmon_data_t
typedef struct gmon_data gmon_data_t;
macroGMONTYPE_SAMPLES
The GMONTYPE_SAMPLES gmon_data.type is for the histogram counters described
above and has a gmonhdr_t followed by the counters.
#define GMONTYPE_SAMPLES 1
macroGMONTYPE_RAWARCS
The GMONTYPE_RAWARCS gmon_data.type is for the raw arcs described above.
#define GMONTYPE_RAWARCS 2
macroGMONTYPE_ARCS_ORDERS
The GMONTYPE_ARCS_ORDERS gmon_data.type is for the raw arcs with a call
order field. The order is the order is a sequence number for the order each
call site was executed. Raw_order values start at 1 not zero. Other than
the raw_order field this is the same information as in the rawarc_t.
#define GMONTYPE_ARCS_ORDERS 3
structrawarc_order
| uint32_t | raw_frompc | |
| uint32_t | raw_selfpc | |
| uint32_t | raw_count | |
| uint32_t | raw_order |
structrawarc_order_64
| uint64_t | raw_frompc | |
| uint64_t | raw_selfpc | |
| uint32_t | raw_count | |
| uint32_t | raw_order |
typedefrawarc_order_t
typedef struct rawarc_order_64 rawarc_order_t;
macroGMONTYPE_DYLD_STATE
The GMONTYPE_DYLD_STATE gmon_data.type is for the dynamic link editor state
of the program.
The informations starts with an uint32_t with the count of states:
image_count
Then each state follows in the file. The state is made up of
vmaddr_slide (the amount dyld slid this image from it's vmaddress)
name (the file name dyld loaded this image from)
The vmaddr_slide is a 32-bit value for 32-bit programs and 64-bit value for
64-bit programs.
#define GMONTYPE_DYLD_STATE 4
macroGMONTYPE_DYLD2_STATE
The GMONTYPE_DYLD2_STATE gmon_data.type is for the dynamic link editor state
of the program.
The informations starts with an uint32_t with the count of states:
image_count
Then each state follows in the file. The state is made up of
image_header (the address where dyld loaded this image)
name (the file name dyld loaded this image from)
The image_header is a 32-bit value for 32-bit programs and 64-bit value for
64-bit programs.
#define GMONTYPE_DYLD2_STATE 5