分类: C/C++
2008-04-15 08:58:51
表16 - proc探测器
探测器 |
描述 |
create |
使用fork(2),forkall(2),fork1(2)或者vfork(2)创建进程时触发的探测器。args[0]指向对应于新的子进程
的psinfo_t结构的指针。由于create探测器只在进程被成功创建之后触发,而LWP创建是进程创建的一部分,所以在新进程的create探测器
触发之前,LWP的创建会触发lwp-create探测器。 |
exec |
当进程使用各种exec(2)系统调用准备装载新的程序映像,并在装载前触发的探测器。在exec探测器被触发之后,exec-failure或者exec-success会随之触发。args[0]指向新的程序映像。 |
exec-failure |
当exec(2)失败时触发的探测器。exec-failure只在exec探测器在同一个线程触发之后触发。args[0]包含errno(3C)的值。 |
exec-success |
当exec(2)成功时触发的探测器。exec-success只在exec探测器在同一个线程触发之后触发。exec-success探测器触发的时候,进程标量(如execname和curpsinfo)将包含新的程序映像被装载后的进程状态。 |
exit |
当前进程退出时触发的探测器。退出的原因(由siginfo(3HEAD)的SIGCHILD之一表示)在args[0]中。 |
fault |
当线程遇到机器故障时触发的探测器。args[0]包含了错误代码(在proc(4)中定义),args[1]指向与故障相关的siginfo结构。只有能够引起信号的故障才能触发此探测器。 |
lwp-create |
当LWP被创建时(主要通过thr_create(3C))触发的探测器。args[0]指向新线程的lwpsinfo_t结构,args[1]指向包含此新线程的进程的psinfo_t结构。 |
lwp-start |
在新创建的LWP环境中触发的探测器。此探测器在任何用户程序执行之前触发。如果当前LWP是进程的第一个LWP,则start探测器会先触发,然后就是lwp-start探测器触发。 |
lwp-exit |
当LWP由于收到信号或者通过调用thr_exit(3C)退出时触发的探测器。 |
signal-discard |
当信号发送到单线程进程,并且信号未被该进程阻塞但被该进程忽略时触发的探测器。在这些条件下,信号在生成时就被废弃。args[0]指向目标进程的lwpsinfo_t结构,args[1]指向目标进程的psinfo_t结构,args[2]包含信号代码。 |
signal-send |
当信号发送到线程或者进程时触发的探测器。此探测器在发送信号的进程和线程的环境中
触发。args[0]指向接收信号的进程或线程的lwpsinfo_t结构,args[1]指向接收信号的进程或线程的psinfo_t结构,args
[2]包含信号代码。signal-send触发之后通常会有接收到信号的进程和线程的signal-handle或者signal-clear探测器的
触发。 |
signal-handle |
在进程处理信号之前触发的探测器。此探测器在处理信号的线程环境中触发。args[0]包含信号代码,args[1]包含信号的siginfo_t结构指针,args[2]包含进程中信号处理程序的地址。 |
signal-clear |
由于目标线程调用sigwait(2),sigwaitinfo(3RT)或者sigtimedwait(3RT)清除暂挂的信号时触发的探测器。在这些条件下,暂挂的信号被清除,信号代码返回给调用者。args[0]包含信号代码。此探测器在之前等待的线程环境下触发。 |
start |
在新创建的进程开始执行用户程序之前触发的探测器。 |
表17- proc探测器参数
探测器 | args[0] |
args[1] |
args[2] |
create | psrinfo_t * |
- |
- |
exec |
char * |
- |
- |
exec-failure |
int |
- |
- |
exit |
int |
- |
- |
fault |
int |
siginfo_t * |
- |
lwp-create |
lwpsinfo_t * |
psinfo_t * |
- |
lwp-start |
- |
- |
- |
lwp-exit |
- |
- |
- |
signal-discard |
lwpsinfo_t * |
psinfo_t * |
int |
signal-send |
lwpsinfo_t * | psinfo_t * | int |
signal-handle |
int |
siginfo_t * |
void(*)(void) |
signal-clear |
int |
- |
- |
start |
- |
- |
- |
下面是上表中Dtrace定义的lwpsinfo_t数据结构
typedef struct lwpsinfo {
int pr_flag; /* 进程状态标志 */
id_t pr_lwpid; /* LWP ID号 */
uintptr_t pr_addr; /* 线程数据结构在内核中的地址 */
uintptr_t pr_wchan; /* 睡眠线程等待的同步对象的地址(比如互斥锁,读写锁等) */
char pr_stype; /* 同步事件的类型 */
char pr_state; /* 数字表示的线程状态 */
char pr_sname; /* 可打印的线程状态 */
char pr_nice; /* CPU使用的nice值 */
short pr_syscall; /* 系统调用号(/etc/name_to_sysnum),只在线程执行系统调用时有效 */
int pr_pri; /* 优先级,值越大优先级越高 */
char pr_clname[PRCLSZ]; /* 进程调度分类名 */
processorid_t pr_onpro; /* 上一次运行此线程的处理器 */
processorid_t pr_bindpro; /* 此线程捆绑的处理器 */
psetid_t pr_bindpset; /* 此线程捆绑的处理器集 */
} lwpsinfo_t;
Dtrace定义的psinfo_t结构
typedef struct psinfo {
int pr_nlwp; /* 当前进程的活跃的LWP的数量 */
pid_t pr_pid; /* 唯一的进程PID */
pid_t pr_ppid; /* 父进程的PID */
pid_t pr_pgid; /* 进程组领导进程的PID */
pid_t pr_sid; /* 会话ID */
uid_t pr_uid; /* 实际用户ID */
uid_t pr_euid; /* 有效用户ID */
gid_t pr_gid; /* 实际组ID */
gid_t pr_egid; /* 有效组ID */
uintptr_t pr_addr; /* 进程数据结构在内核中的地址 */
dev_t pr_ttydev; /* 此进程控制的TTY设备 (如果未与TTY关联,则为 PRNODEV) */
timestruc_t pr_start; /* 从UNIX纪元开始的进程启动时间 */
char pr_fname[PRFNSZ]; /* 执行文件的名字 */
char pr_psargs[PRARGSZ]; /* 参数列表 */
int pr_argc; /* 参数个数 */
uintptr_t pr_argv; /* 参数向量的地址 */
uintptr_t pr_envp; /* 环境变量的地址 */
char pr_dmodel; /* 程序的数据模式(ILP32或者LP64) */
taskid_t pr_taskid; /* 任务ID */
projid_t pr_projid; /* 项目ID */
poolid_t pr_poolid; /* 资源池ID */
zoneid_t pr_zoneid; /* 分区ZONE ID */
} psinfo_t;
sched提供器
sched提供器提供与CPU调度相关的探测器。
表18-sched探测器
探测器 |
说明 |
change-pri | 在线程优先级将要改变时触发的探测器。args[0]指向线程的lwpsinfo_t结构,进程当前的优先级在pr_pri中。args[1]指向包含当前线程的进程的psinfo_t结构,args[2]包含线程新的优先级。 |
dequeue |
可运行线程离开运行队列前瞬间触发的探测器。args[0]指向离开运行队列的线程的lwpsinfo_t结构,
args[1]指向包含该线程的进程的psinfo_t结构,args[2]指向运行队列所在的CPU的cpuinfo_t结构,如果运行队列与CPU无
关,则此结构的cpu_id为"-1"。 |
enqueue |
当可运行线程加载到运行队列是触发的探测器。 |
off-cpu |
当前CPU将要结束运行线程时触发的探测器。 |
on-cpu |
当前CPU将开始执行线程时触发的探测器。 |
preempt |
当前线程被抢占前瞬间触发的探测器。此探测器触发后,当前线程会选择一个新线程执
行,因此在当前线程环境下会触发off-cpu探测器。在某些情况下,抢占的线程可能在另外一个CPU上运行,而调度程序找不到更高级别的进程,这时候,
被抢占的线程仍然留在当前CPU上,因此会触发remain-cpu探测器。 |
remain-cpu |
当调度程序选择继续执行当前线程时触发的探测器。 |
schedctl-nopreempt |
当线程被抢占,又由于抢占控制请求重新插入到运行队列前面时触发的探测器。 |
schedctl-preempt |
使用抢占控制的线程被抢占被被放置到运行队列后面时触发的探测器。 |
schedctl-yield |
启用了抢占控制并且延长了执行时间片的线程释放CPU给其它线程时触发的探测器。 |
sleep |
当前线程在同步对象上休眠时触发的探测器。 |
surrender |
一个CPU被令一个CPU指示作出调度决定(通常是因为更高级别的线程可运行时)触发的探测器。 |
tick |
时钟线程周期审计服务(tick)触发的探测器。 |
wakeup |
当前线程唤醒一个在同步对象上休眠的线程时触发的探测器。 |
表19-sched探测器参数
探测器 | args[0] |
args[1] |
args[2] |
args[3] |
change-pri | lwpsinfo_t * |
psinfo_t * |
pri_t |
- |
dequeue |
lwpsinfo_t * |
psinfo_t * |
cpuinfo_t * |
- |
enqueue |
lwpsinfo_t * |
psinfo_t * |
cpuinfo_t * |
int |
off-cpu |
lwpsinfo_t * |
psinfo_t * |
- |
- |
on-cpu |
- |
- |
- |
- |
preempt |
- |
- |
- |
- |
remain-cpu |
- |
- |
- |
- |
schedctl-nopreempt |
lwpsinfo_t * |
psinfo_t * |
- |
- |
schedctl-preempt |
lwpsinfo_t * |
psinfo_t * |
- |
- |
schedctl-yield |
lwpsinfo_t * |
psinfo_t * |
- |
- |
sleep |
- |
- |
- |
- |
surrender |
lwpsinfo_t * |
psinfo_t * |
- |
- |
tick |
lwpsinfo_t * |
psinfo_t * |
- |
- |
wakeup |
lwpsinfo_t * |
psinfo_t * |
- |
- |
下面是sched提供中中需要用到的cpuinfo_t结构
typedef struct cpuinfo {
processorid_t cpu_id; /* CPU 标志 */
psetid_t cpu_pset; /* 处理器集标志 */
chipid_t cpu_chip; /* 芯片标志 */
lgrp_id_t cpu_lgrp; /* 位置组标志 */
processor_info_t cpu_info; /* CPU 信息 */
} cpuinfo_t;
io提供器
io提供器提供了与磁盘及NFS输入输出操作相关的探测器。
表20-io探测器
探测器 |
描述 |
start |
将要执行I/O请求时触发的探测器。args[0]指向对应于I/O请求的bufinto_t结构,args[1]指向I/O请求设备的devinfo_t结构,args[2]指向I/O请求的文件fileinto_t结构 |
done |
I/O请求完成后触发的探测器。参数同上 |
wait-start |
线程开始等待指定的I/O请求完成之前瞬间触发的探测器。参数同上。此探测器触发后不久wait-done会在同一线程中触发。 |
wait-done |
等待的I/O请求完成时触发的探测器,参数同上。 |
下面是参数中会用到的结构
typedef struct bufinfo {
int b_flags; /* 标志 */
size_t b_bcount; /* 字节数*/
caddr_t b_addr; /* 缓冲区地址 */
uint64_t b_blkno; /* 设备上的扩展块号 */
uint64_t b_lblkno; /* 设备块号 */
size_t b_resid; /* 未传输的字节数 */
size_t b_bufsize; /* 分配的缓冲区的大小 */
caddr_t b_iodone; /* I/O完成执行的程序 */
dev_t b_edev; /* 设备号 */
} bufinfo_t;
typedef struct devinfo {
int dev_major; /* 主设备号 */
int dev_minor; /* 次设备号 */
int dev_instance; /* 实例号 */
string dev_name; /* 设备名 */
string dev_statname; /* 设备名+实例号/次设备号 */
string dev_pathname; /* 设备路径名 */
} devinfo_t;
typedef struct fileinfo {
string fi_name; /* 文件名(不带目录部分) */
string fi_dirname; /* 目录名 */
string fi_pathname; /* 绝对路径名 */
offset_t fi_offset; /* 文件内的偏移地址 */
string fi_fs; /* 文件系统 */
string fi_mount; /* 文件系统安装点 */
} fileinfo_t;
除此之外,还有pid提供器、mib提供器、fpuinfo提供器、plockstat提供器、fasttrap提供器等,限于时间关系,我就不在这里介绍了。感兴趣的朋友建议仔细阅读《》。