profil 子例程

用途

启动和停止程序地址采样以进行执行概要分析。

标准 C 库 (libc.a)

语法

#include <monmon.h

void profil ( ShortBuffer, BufferSize, Offset, Scale)ORvoid profil ( ProfBuffer,-1, 0, 0)

unsigned short*ShortBuffer; struct prof*ProfBuffer; unsigned int Buffersize, Scale; unsigned long Offset

描述

profil子程序将记录调用进程程序计数器的周期性采样值直方图。 如果BufferSize不为-1

  • profil子程序的参数解释如第一个语法定义所示。
  • 在此调用之后,如果进程是当前处于活动状态的进程,那么将检查进程的程序计数器 (pc)。 从 pc 中减去 Offset 参数的值。 结果乘以 刻度参数值,右移 16 位,并四舍五入为下一个半字对齐的值。 如果得出的数字小于BufferSize值除以sizeof(short),则ShortBuffer参数内的相应short会递增。 如果此增量的结果将溢出无符号短整型,那么它仍为 USHRT_MAX。
  • Scale 参数的最低有效 16 位被解释为无符号的定点分数,其左边有一个二进制点。 将忽略 Scale 参数的最重要的 16 位。 例如:

    八进制 十六进制 含义
    0177777 0xFFFF 将指令空间中的每一对字节近似映射到ShortBuffer参数中的一个唯一short
    077777 0x7FFF 将大约每四个字节映射为ShortBuffer参数中的一个short
    02 0x0002 将所有指令映射到同一位置,生成非中断核心时钟。
    01 0x0001 关闭概要分析。
    00 0x0000 关闭概要分析。 
    注:无法将指令空间的每个字节映射到ShortBuffer参数中的单个短节。
  • 如果BufferSize参数的值为 0,则使用第一种语法定义的剖析功能将失效。

如果BufferSize参数值为-1:

  • profil子程序的参数解释如第二个语法定义所示。 在这种情况下,Offset Scale参数被忽略,ProfBuffer参数指向prof结构数组。 prof结构在mon.h文件中定义,包含以下成员:
    caddr_t          p_low;
    caddr_t          p_high;
    HISTCOUNTER     *p_buff;
    int              p_bufsize;
    uint             p_scale;

如果指定了p_scale成员的值为-1 时,将根据p_low,p_highp_bufsize否则p_scale的解释与第一个提要中的比例参数相同。 该p_high连续结构中的成员必须按升序排列。 结构数组的最后是一个包含p_high成员设置为 0;最后一个结构中的所有其他字段将被忽略。

p_buffprof结构数组中的缓冲区指针必须指向一个连续的缓冲区空间。

  • 使用第二种语法定义关闭剖析,方法是给出一个ProfBuffer参数,这样p_high第一个结构的元素等于 0。

在所有情况下:

  • fork子程序之后,子进程和父进程都将保持剖析状态。
  • 运行 执行子程序时,将关闭剖析功能。
  • 如果之前已使用一种语法定义开启了剖析功能,而现在试图使用另一种语法定义关闭剖析功能,则调用profil子例程无效。
  • A call to the 形象 subroutine is ineffective if the call is attempting to turn on profiling when profiling is already turned on, or if the call is attempting to turn off profiling when profiling is already turned off.

参数

描述
ShortBuffer 指向用户地址空间中的内存区域。 其长度 (以字节计) 由 BufferSize 参数给出。
BufferSize 指定缓冲区的长度 (以字节计)。
抵消 指定程序计数器起始点和缓冲区的时间差;例如, 偏移为 0 表示文本从 0 开始。 如果用户要将例程的入口点用于 Offset 参数,那么该参数的语法如下所示:

*(长 *)例程名称

SCALE 指定程序计数器与 ShortBuffer之间的映射因子。
ProfBuffer 指向prof结构数组。

返回值

profil子程序返回值始终为 0。 否则,将设置errno全局变量来指示错误。

错误代码

如果以下一项或两项为真,profil子程序将失败:

描述
EFAULT ShortBufferProfBuffer参数指定的地址无效,或者由p_buff字段无效。 如果没有足够的资源将概要分析缓冲区锁定在实存储器中,那么也会发生 Efault。
EINVAL p_highfields in the 概况 structure specified by the ProfBuffer parameter are not in ascending order.