Die Argumenttypen für proc-Prüfpunkte sind in Tabelle 25–2 aufgeführt. In Tabelle 25–1 finden Sie eine Beschreibung der Argumente.
Tabelle 25–2 Argumente für proc-Prüfpunkte
Prüfpunkt |
args[0] |
args[1] |
args[2] |
---|---|---|---|
create |
psinfo_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-discard |
lwpsinfo_t * |
psinfo_t * |
int |
signal-send |
lwpsinfo_t * |
psinfo_t * |
int |
signal-handle |
int |
siginfo_t * |
void (*)(void) |
signal-clear |
int |
— |
— |
start |
— |
— |
— |
Einige proc-Prüfpunkte besitzen Argumente des Typs lwpsinfo_t, wobei es sich um eine in proc(4) dokumentierte Struktur handelt. Die Definition der den DTrace-Verbrauchern zur Verfügung stehenden Struktur lwpsinfo_t lautet:
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;
Das Feld pr_flag ist eine Bit-Maske, die den Prozess beschreibende Flags enthält. Diese Flags und ihre Bedeutung sind in Tabelle 25–3 beschrieben.
Tabelle 25–3 pr_flag-Werte
PR_ISSYS |
Der Prozess ist ein Systemprozess. |
PR_VFORKP |
Der Prozess ist der übergeordnete Prozess eines vfork(2)-Unterprozesses. |
PR_FORK |
Der Modus inherit-on-fork des Prozesses ist gesetzt. |
PR_RLC |
Der Modus run-on-last-close des Prozesses ist gesetzt. |
PR_KLC |
Der Modus kill-on-last-close des Prozesses ist gesetzt. |
PR_ASYNC |
Der Modus asynchronous-stop des Prozesses ist gesetzt. |
PR_MSACCT |
Die Mikrostatusabrechnung (microstate accounting) ist im Prozess aktiviert. |
PR_MSFORK |
Die Mikrostatusabrechnung des Prozesses wird bei fork vererbt. |
PR_BPTADJ |
Der Modus breakpoint-adjustment des Prozesses ist gesetzt. |
PR_PTRACE |
Der Modus ptrace(3C)-compatibility des Prozesses ist gesetzt. |
PR_STOPPED |
Der Thread ist ein angehaltener LWP. |
PR_ISTOP |
Der Thread ist ein an einem Ereignis von Interesse angehaltener LWP. |
PR_DSTOP |
Der Thread ist ein LWP, für den eine stop-Direktive in Kraft ist. |
PR_STEP |
Der Thread ist ein LWP, für den eine single-step-Direktive in Kraft ist. |
PR_ASLEEP |
Der Thread ist ein LWP in unterbrechbarem Schlafzustand innerhalb eines Systemaufrufs. |
PR_DETACH |
Der Thread ist ein gesonderter LWP. Informationen hierzu finden Sie unter pthread_create(3C) und pthread_join(3C). |
PR_DAEMON |
Der Thread ist ein Dämon-LWP. Siehe hierzu pthread_create(3C). |
PR_AGENT |
Der Thread ist der Agent-LWP für den Prozess. |
PR_IDLE |
Der Thread ist der Leerlauf-Thread für eine CPU. Es laufen nur dann Leerlauf-Threads auf einer CPU, wenn die Ausführungswarteschlangen für die CPU leer sind. |
Das Feld pr_addr ist die Adresse einer privaten Datenstruktur im Kernel, die den Thread darstellt. Die Datenstruktur ist privat, aber das Feld pr_addr kann für die gesamte Lebensdauer eines Threads als eindeutiges Symbol für diesen verwendet werden.
Das Feld pr_wchan wird gesetzt, wenn sich der Thread an einem Synchronisierungsobjekt schlafen legt. Die Bedeutung des Felds pr_wchan ist der Kernel-Implementierung vorbehalten, aber das Feld kann als eindeutiges Symbol für das Synchronisierungsobjekt verwendet werden.
Das Feld pr_stype wird gesetzt, wenn sich der Thread an einem Synchronisierungsobjekt schlafen legt. Die möglichen Werte für das Feld pr_stype sehen Sie in Tabelle 25–4.
Tabelle 25–4 pr_stype-Werte
SOBJ_MUTEX |
Mutex-Synchronisierungsobjekt für Kernel. Dient zur Serialisierung des Zugriffs auf gemeinsame Datenbereiche im Kernel. In Kapitel 18Der Provider lockstat und mutex_init(9F) finden Sie ausführliche Informationen zu Mutex-Synchronisierungsobjekten für den Kernel. |
SOBJ_RWLOCK |
Leser/Schreiber-Synchronisierungsobjekt für Kernel. Dient zum Synchronisieren des Zugriffs auf gemeinsame Objekte im Kernel, die mehrere Leser gleichzeitig oder einen einzigen Schreiber zulassen können. In ·Kapitel 18Der Provider lockstat und rwlock(9F) finden Sie ausführliche Informationen zu Leser/Schreiber-Synchronisierungsobjekten für den Kernel. |
SOBJ_CV |
Bedingungsvariablen-Synchronisierungsobjekt. Eine Bedingungsvariable ist darauf ausgerichtet, auf unbestimmte Zeit darauf zu warten, dass eine bestimmte Bedingung eintritt. Bedingungsvariablen dienen in der Regel zum Synchronisieren anderer Vorgänge als den Zugriffen auf gemeinsame Datenbereiche und stellen den Mechanismus dar, der allgemein verwendet wird, wenn ein Prozess einen programmgesteuerten Wartezustand auf unbestimmte Zeit annimmt. Dabei handelt es sich beispielsweise um das Blockieren in poll(2), pause(2), wait(3C) usw. |
SOBJ_SEMA |
Semaphoren-Synchronisierungsobjekt. Ein Allzweck-Synchronisierungsobjekt, das, wie auch Bedingungsvariablenobjekte, keinen Besitz kennt. Da der Aspekt des Besitzes zum Implementieren der Prioritätsvererbung im Solaris-Kernel erforderlich ist, verbietet das Fehlen dieses Aspekts in Semaphorenobjekten eine weite Verbreitung dieser Objekte. Ausführliche Informationen finden Sie im Abschnitt semaphore(9F). |
SOBJ_USER |
Ein Synchronisierungsobjekt auf Benutzerebene Sämtliche Blockierungen von Synchronisierungsobjekten auf Benutzerebene werden mit SOBJ_USER-Synchronisierungsobjekten behandelt. Zu den Synchronisierungsobjekten auf Benutzerebene gehören die mit mutex_init(3C), sema_init(3C), rwlock_init(3C), cond_init(3C) und deren POSIX-Pendants erzeugten Objekte. |
SOBJ_USER_PI |
Ein Synchronisierungsobjekt auf Benutzerebene, das die Prioritätsvererbung implementiert. Einige Synchronisierungsobjekte auf Benutzerebene, die zusätzliche Benutzerinformationen bieten, ermöglichen die Prioritätsvererbung. So kann beispielsweise für Mutex-Objekte, die mit pthread_mutex_init(3C) erzeugt wurden, anhand von pthread_mutexattr_setprotocol(3C) die Prioritätsvererbung erreicht werden. |
SOBJ_SHUTTLE |
Ein Shuttle-Synchronisierungsobjekt Shuttle-Objekte dienen zum Implementieren von Doors. Näheres hierzu siehe door_create(3DOOR). |
Das Feld pr_state wird auf einen der Werte in Tabelle 25–5 gesetzt. In Klammern sehen Sie das entsprechende Zeichen, auf das das Feld pr_sname gesetzt wird.
Tabelle 25–5 pr_state-Werte
SSLEEP (S) |
Der Thread schläft. Der Prüfpunkt sched:::sleep wird ausgelöst, unmittelbar bevor der Status eines Threads in SSLEEP übergeht. |
SRUN (R) |
Der Thread ist lauffähig, läuft aber derzeit nicht. Der Prüfpunkt sched:::enqueue wird ausgelöst, unmittelbar bevor der Status eines Threads in SRUN übergeht. |
SZOMB (Z) |
Der Thread ist ein Zombie-LWP. |
SSTOP (T) |
Der Thread wurde entweder durch eine explizite proc(4)-Direktive oder einen anderen Anhaltemechanismus angehalten. |
SIDL (I) |
Der Thread befindet sich in einem Zwischenstatus der Prozesserzeugung. |
SONPROC (O) |
Der Thread läuft auf einer CPU. Der Prüfpunkt sched:::on-cpu wird im Kontext des SONPROC-Threads kurz nach dem Übergang des Thread-Status in SONPROC ausgelöst. |
Einige proc-Prüfpunkte besitzen ein Argument des Typs psinfo_t, wobei es sich um eine in proc(4) dokumentierte Struktur handelt. Die den DTrace-Verbrauchern zur Verfügung stehende Definition der Struktur psinfo_t lautet:
typedef struct psinfo { int pr_nlwp; /* number of active lwps in the process */ pid_t pr_pid; /* unique process id */ pid_t pr_ppid; /* process id of parent */ pid_t pr_pgid; /* pid of process group leader */ pid_t pr_sid; /* session id */ uid_t pr_uid; /* real user id */ uid_t pr_euid; /* effective user id */ gid_t pr_gid; /* real group id */ gid_t pr_egid; /* effective group id */ uintptr_t pr_addr; /* address of process */ dev_t pr_ttydev; /* controlling tty device (or PRNODEV) */ timestruc_t pr_start; /* process start time, from the epoch */ char pr_fname[PRFNSZ]; /* name of execed file */ char pr_psargs[PRARGSZ]; /* initial characters of arg list */ int pr_argc; /* initial argument count */ uintptr_t pr_argv; /* address of initial argument vector */ uintptr_t pr_envp; /* address of initial environment vector */ char pr_dmodel; /* data model of the process */ taskid_t pr_taskid; /* task id */ projid_t pr_projid; /* project id */ poolid_t pr_poolid; /* pool id */ zoneid_t pr_zoneid; /* zone id */ } psinfo_t;
Das Feld pr_dmodel wird entweder auf PR_MODEL_ILP32 (bezeichnet einen 32-Bit-Prozess) oder auf PR_MODEL_LP64 (bezeichnet einen 64-Bit-Prozess) gesetzt.