Solaris 动态跟踪指南

lwpsinfo_t

多种 proc 探测器具有 lwpsinfo_tproc(4) 中记录的一种结构)类型的参数。DTrace 使用者可以使用的 lwpsinfo_t 结构的定义如下所示:

typedef struct lwpsinfo {
	int pr_flag;              /* flags; see below */
	id_t pr_lwpid;            /* LWP id */
	uintptr_t pr_addr;        /* internal address of thread */
	uintptr_t pr_wchan;       /* wait addr for sleeping thread */
	char pr_stype;            /* synchronization event type */
	char pr_state;            /* numeric thread state */
	char pr_sname;            /* printable character for pr_state */
	char pr_nice;             /* nice for cpu usage */
	short pr_syscall;         /* system call number (if in syscall) */
	int pr_pri;               /* priority, high value = high priority */
	char pr_clname[PRCLSZ];   /* scheduling class name */
	processorid_t pr_onpro;   /* processor which last ran this thread */
	processorid_t pr_bindpro; /* processor to which thread is bound */
	psetid_t pr_bindpset;     /* processor set to which thread is bound */
} lwpsinfo_t;

pr_flag 字段是存储用于说明进程的标志的位掩码。表 25–3 中说明了这些标志及其含义。

表 25–3 pr_flag

PR_ISSYS

该进程为系统进程。 

PR_VFORKP

该进程是 vfork(2) 的子进程的父进程。

PR_FORK

该进程具有从 fork 中继承的模式集。 

PR_RLC

该进程具有最后一次关闭时运行的模式集。 

PR_KLC

该进程具有最后一次关闭时中止的模式集。 

PR_ASYNC

该进程具有异步停止模式集。 

PR_MSACCT

该进程已启用微状态记帐。 

PR_MSFORK

进程微状态记帐继承于 fork。 

PR_BPTADJ

该进程具有断点调整模式集。 

PR_PTRACE

该进程具有 ptrace(3C) 兼容的模式集。

PR_STOPPED

该线程是已停止的 LWP。 

PR_ISTOP

该线程是在出现关注的事件时停止的 LWP。 

PR_DSTOP

该线程是具有正在生效的停止指令的 LWP。 

PR_STEP

该线程是具有正在生效的单步指令的 LWP。 

PR_ASLEEP

该线程是系统调用的可中断休眠中的 LWP。 

PR_DETACH

该线程是拆离的 LWP。请参见 pthread_create(3C)pthread_join(3C)

PR_DAEMON

该线程是守护进程 LWP。请参见 pthread_create(3C)

PR_AGENT

该线程是进程的代理 LWP。 

PR_IDLE

该线程是 CPU 的空闲线程。当 CPU 的运行队列为空时,空闲线程仅在 CPU 中运行。 

pr_addr 字段是表示线程的专用、内核中的数据结构的地址。虽然该数据结构为专用,但 pr_addr 字段可用作在线程的生命周期中线程的唯一标记。

当线程在同步对象上休眠时,将设置 pr_wchan 字段。pr_wchan 字段的含义专用于内核实现,但该字段也可用作同步对象的唯一标记。

当线程在同步对象上休眠时,将设置 pr_stype 字段。表 25–4 中说明了 pr_stype 字段的可能值。

表 25–4 pr_stype

SOBJ_MUTEX

内核互斥同步对象。用于串行化内核中共享数据区域的访问。有关内核互斥同步对象的详细信息,请参见第 18 章mutex_init(9F)

SOBJ_RWLOCK

内核读取器/写入器同步对象。用于同步内核中共享对象的访问,共享对象可以允许多个并发读取器或一个写入器。有关内核读取器/写入器同步对象的详细信息,请参见第 18 章rwlock(9F)

SOBJ_CV

条件变量同步对象。条件变量的设计是无限等待,直到某个条件变为 true。条件变量通常用于同步(出于访问共享数据区域之外的原因),它通常是当进程执行程序指令的无限等待时使用的机制。例如,在 poll(2)pause(2)wait(3C) 中阻塞,以及类似情况。

SOBJ_SEMA

信号同步对象。一般用途的同步对象,与条件变量对象一样,不跟踪拥有权说明。由于在 Solaris 内核中实现优先级继承必须具有拥有权,所以信号对象中没有固有拥有权将使这些对象不能被广泛使用。有关详细信息,请参见 semaphore(9F)

SOBJ_USER

用户级同步对象。所有对用户级同步对象的阻塞都使用 SOBJ_USER 同步对象处理。用户级同步对象包括使用 mutex_init(3C)sema_init(3C)rwlock_init(3C)cond_init(3C) 及其 POSIX 等效项创建的对象。

SOBJ_USER_PI

实现优先级继承的用户级同步对象。一些跟踪拥有权的用户级同步对象还允许优先级继承。例如,使用 pthread_mutex_init(3C) 创建的互斥对象可以使用 pthread_mutexattr_setprotocol(3C) 设置为继承优先级。

SOBJ_SHUTTLE

互动同步对象。互动对象用于实现门。有关更多信息,请参见 door_create(3DOOR)。 

pr_state 字段设置为表 25–5 中的某个值。pr_sname 字段设置为同一个表中括号内说明的相应字符。

表 25–5 pr_state

SSLEEP (S)

线程处于休眠状态。sched:::sleep 探测器就在线程的状态转换为 SSLEEP 之前的瞬间触发。

SRUN (R)

该线程可运行,但当前未运行。sched:::enqueue 探测器将在线程的状态转换为 SRUN 之前的瞬间触发。

SZOMB (Z)

该线程是僵 LWP。 

SSTOP (T)

由于显式 proc(4) 指令或一些其他停止机制,该线程已停止。

SIDL (I)

该线程是进程创建期间的中间状态。 

SONPROC (O)

该线程正在 CPU 中运行。sched:::on-cpu 探测器将在线程的状态转换为 SONPROC 一段时间后,在 SONPROC 线程的上下文中触发。