proc Provider
The proc
provider makes available probes pertaining
to the following activities: process creation and termination, LWP creation
and termination, executing new program images, and sending and handling signals.
25.1. Probes
The proc
probes are described in proc Probes.
Probe |
Description |
---|---|
|
Probe that fires when a process is created using
fork(2),
forkall(2),
fork1(2),
or vfork(2).
The |
|
Probe that fires whenever a process loads a new process
image with a variant of the
exec(2)
system call:
exec(2),
execle(2),
execlp(2),
execv(2),
execve(2),
or execvp(2).
The |
|
Probe that fires when an
exec(2)
variant has failed. This probe fires only after the |
|
Probe that fires when an
exec(2)
variant has succeeded. Like the |
|
Probe that fires when the current process is exiting. The reason for exit, which is
expressed as one of the |
|
Probe that fires when a thread experiences a machine fault. The fault code (as defined
in
proc(4))
is in |
|
Probe that fires when an LWP is created, typically as a result of
thr_create(3C).
The |
|
Probe that fires within the context of a newly created LWP. The
|
|
Probe that fires when an LWP is exiting, due either to a signal or to an explicit call to thr_exit(3C). |
|
Probe that fires when a signal is sent to a single-threaded process, and
the signal is both unblocked and ignored by the process. Under these
conditions, the signal is discarded on generation. The
|
|
Probe that fires when a signal is sent to a thread or process. The
|
|
Probe that fires immediately before a thread handles a signal. The
|
|
Probes that fires when a pending signal is cleared because the target
thread was waiting for the signal in
sigwait(2),
sigwaitinfo(3RT),
or sigtimedwait(3RT).
Under these conditions, the pending signal is cleared and the signal number is
returned to the caller. The signal number is in |
|
Probe that fires in the context of a newly created process. The
|
25.2. Arguments
The argument types for the proc
probes
are listed in proc Probe Arguments. The
arguments are described in proc Probes.
Probe |
|
|
|
---|---|---|---|
|
|
— |
— |
|
|
— |
— |
|
|
— |
— |
|
|
— |
— |
|
|
|
— |
|
|
|
— |
|
— |
— |
— |
|
— |
— |
— |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
— |
— |
|
— |
— |
— |
25.2.1. lwpsinfo_t
Several proc
probes have arguments of type lwpsinfo_t
,
a structure that is documented in proc(4).
The definition of the lwpsinfo_t
structure as available
to DTrace consumers is as follows:
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;
The pr_flag
field is a bit-mask holding flags describing
the process. These flags and their meanings are described in pr_flag Values.
|
The process is a system process. |
|
The process is the parent of a vfork(2)'d child. |
|
The process has its inherit-on-fork mode set. |
|
The process has its run-on-last-close mode set. |
|
The process has its kill-on-last-close mode set. |
|
The process has its asynchronous-stop mode set. |
|
The process has microstate accounting enabled. |
|
The process microstate accounting is inherited on fork. |
|
The process has its breakpoint adjustment mode set. |
|
The process has its ptrace(3C)-compatibility mode set. |
|
The thread is an LWP that is stopped. |
|
The thread is an LWP stopped on an event of interest. |
|
The thread is an LWP that has a stop directive in effect. |
|
The thread is an LWP that has a single-step directive in effect. |
|
The thread is an LWP in an interruptible sleep within a system call. |
|
The thread is a detached LWP. See pthread_create(3C) and pthread_join(3C). |
|
The thread is a daemon LWP. See pthread_create(3C). |
|
The thread is the agent LWP for the process. |
|
The thread is the idle thread for a CPU. Idle threads only run on a CPU when the run queues for the CPU are empty. |
The pr_addr
field is the address of a private, in-kernel
data structure representing the thread. While the data structure is private,
the pr_addr
field may be used as a token unique to a thread
for the thread's lifetime.
The pr_wchan
field is set when the thread is sleeping
on a synchronization object. The meaning of the pr_wchan
field
is private to the kernel implementation, but the field may be used as a token
unique to the synchronization object.
The pr_stype
field is set when the thread is sleeping
on a synchronization object. The possible values for the pr_stype
field
are in pr_stype Values.
|
Kernel mutex synchronization object. Used to serialize access to shared data regions in the kernel. See lockstat Provider and mutex_init(9F) for details on kernel mutex synchronization objects. |
|
Kernel readers/writer synchronization object. Used to synchronize access to shared objects in the kernel that can allow multiple concurrent readers or a single writer. See lockstat Provider and rwlock(9F) for details on kernel readers/writer synchronization objects. |
|
Condition variable synchronization object. A condition variable is designed to wait indefinitely until some condition becomes true. Condition variables are typically used to synchronize for reasons other than access to a shared data region, and are the mechanism generally used when a process performs a program-directed indefinite wait. For example, blocking in poll(2), pause(2), wait(3C), and the like. |
|
Semaphore synchronization object. A general-purpose synchronization object that – like condition variable objects – does not track a notion of ownership. Because ownership is required to implement priority inheritance in the illumos kernel, the lack of ownership inherent in semaphore objects inhibits their widespread use. See semaphore(9F) for details. |
|
A user-level synchronization object. All blocking on user-level synchronization
objects is handled with |
|
A user-level synchronization object that implements priority inheritance. Some user-level synchronization objects that track ownership additionally allow for priority inheritance. For example, mutex objects created with pthread_mutex_init(3C) may be made to inherit priority using pthread_mutexattr_setprotocol(3C). |
|
A shuttle synchronization object. Shuttle objects are used to implement doors. See door_create(3DOOR) for more information. |
The pr_state
field is set to one of the values in pr_state Values. The pr_sname
field
is set to a corresponding character shown in parentheses in the same table.
|
The thread is sleeping. The |
|
The thread is runnable, but is not currently running. The
|
|
The thread is a zombie LWP. |
|
The thread is stopped, either due to an explicit proc(4) directive or some other stopping mechanism. |
|
The thread is an intermediate state during process creation. |
|
The thread is running on a CPU. The |
25.2.2. psinfo_t
Several proc
probes have an argument of type psinfo_t
,
a structure that is documented in proc(4).
The definition of the psinfo_t
structure as available to
DTrace consumers is as follows:
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;
The pr_dmodel
field is set to either PR_MODEL_ILP32
, denoting a 32–bit process, or PR_MODEL_LP64
,
denoting a 64–bit process.
25.3. Examples
25.3.1. exec
You can use the exec
probe to easily determine
which programs are being executed, and by whom, as shown in the following
example:
#pragma D option quiet
proc:::exec
{
self->parent = execname;
}
proc:::exec-success
/self->parent != NULL/
{
@[self->parent, execname] = count();
self->parent = NULL;
}
proc:::exec-failure
/self->parent != NULL/
{
self->parent = NULL;
}
END
{
printf("%-20s %-20s %s\n", "WHO", "WHAT", "COUNT");
printa("%-20s %-20s %@d\n", @);
}
Running the example script for a short period of time on a build machine results in output similar to the following example:
# dtrace -s ./whoexec.d ^C WHO WHAT COUNT make.bin yacc 1 tcsh make 1 make.bin spec2map 1 sh grep 1 lint lint2 1 sh lint 1 sh ln 1 cc ld 1 make.bin cc 1 lint lint1 1 sh lex 1 make.bin mv 2 sh sh 3 sh make 3 sh sed 4 sh tr 4 make make.bin 4 sh install.bin 5 sh rm 6 cc ir2hf 33 cc ube 33 sh date 34 sh mcs 34 cc acomp 34 sh cc 34 sh basename 34 basename expr 34 make.bin sh 87
25.3.2. start and exit
If you want to know how long programs are running from creation
to termination, you can enable the start
and exit
probes,
as shown in the following example:
proc:::start
{
self->start = timestamp;
}
proc:::exit
/self->start/
{
@[execname] = quantize(timestamp - self->start);
self->start = 0;
}
Running the example script on the build server for several seconds results in output similar to the following example:
# dtrace -s ./progtime.d dtrace: script './progtime.d' matched 2 probes ^C ir2hf value ------------- Distribution ------------- count 4194304 | 0 8388608 |@ 1 16777216 |@@@@@@@@@@@@@@@@ 14 33554432 |@@@@@@@@@@ 9 67108864 |@@@ 3 134217728 |@ 1 268435456 |@@@@ 4 536870912 |@ 1 1073741824 | 0 ube value ------------- Distribution ------------- count 16777216 | 0 33554432 |@@@@@@@ 6 67108864 |@@@ 3 134217728 |@@ 2 268435456 |@@@@ 4 536870912 |@@@@@@@@@@@@ 10 1073741824 |@@@@@@@ 6 2147483648 |@@ 2 4294967296 | 0 acomp value ------------- Distribution ------------- count 8388608 | 0 16777216 |@@ 2 33554432 | 0 67108864 |@ 1 134217728 |@@@ 3 268435456 | 0 536870912 |@@@@@ 5 1073741824 |@@@@@@@@@@@@@@@@@@@@@@@@@ 22 2147483648 |@ 1 4294967296 | 0 cc value ------------- Distribution ------------- count 33554432 | 0 67108864 |@@@ 3 134217728 |@ 1 268435456 | 0 536870912 |@@@@ 4 1073741824 |@@@@@@@@@@@@@@ 13 2147483648 |@@@@@@@@@@@@ 11 4294967296 |@@@ 3 8589934592 | 0 sh value ------------- Distribution ------------- count 262144 | 0 524288 |@ 5 1048576 |@@@@@@@ 29 2097152 | 0 4194304 | 0 8388608 |@@@ 12 16777216 |@@ 9 33554432 |@@ 9 67108864 |@@ 8 134217728 |@ 7 268435456 |@@@@@ 20 536870912 |@@@@@@ 26 1073741824 |@@@ 14 2147483648 |@@ 11 4294967296 | 3 8589934592 | 1 17179869184 | 0 make.bin value ------------- Distribution ------------- count 16777216 | 0 33554432 |@ 1 67108864 |@ 1 134217728 |@@ 2 268435456 | 0 536870912 |@@ 2 1073741824 |@@@@@@@@@ 9 2147483648 |@@@@@@@@@@@@@@@ 14 4294967296 |@@@@@@ 6 8589934592 |@@ 2 17179869184 | 0
25.3.3. lwp-start and lwp-exit
Instead of knowing the amount of time that a particular process
takes to run, you might want to know how long individual threads take to run.
The following example shows how to use the lwp-start
and lwp-exit
probes for this purpose:
proc:::lwp-start
/tid != 1/
{
self->start = timestamp;
}
proc:::lwp-exit
/self->start/
{
@[execname] = quantize(timestamp - self->start);
self->start = 0;
}
Running the example script on an NFS and calendar server results in output similar to the following example:
# dtrace -s ./lwptime.d dtrace: script './lwptime.d' matched 3 probes ^C nscd value ------------- Distribution ------------- count 131072 | 0 262144 |@ 18 524288 |@@ 24 1048576 |@@@@@@@ 75 2097152 |@@@@@@@@@@@@@@@@@@@@@@@ 245 4194304 |@@ 22 8388608 |@@ 24 16777216 | 6 33554432 | 3 67108864 | 1 134217728 | 1 268435456 | 0 mountd value ------------- Distribution ------------- count 524288 | 0 1048576 |@ 15 2097152 |@ 24 4194304 |@@@ 51 8388608 |@ 17 16777216 |@ 24 33554432 |@ 15 67108864 |@@@@ 57 134217728 |@ 28 268435456 |@ 26 536870912 |@@ 39 1073741824 |@@@ 45 2147483648 |@@@@@ 72 4294967296 |@@@@@ 77 8589934592 |@@@ 55 17179869184 | 14 34359738368 | 2 68719476736 | 0 automountd value ------------- Distribution ------------- count 1048576 | 0 2097152 | 3 4194304 |@@@@ 146 8388608 | 6 16777216 | 6 33554432 | 9 67108864 |@@@@@ 203 134217728 |@@ 87 268435456 |@@@@@@@@@@@@@@@ 534 536870912 |@@@@@@ 223 1073741824 |@ 45 2147483648 | 20 4294967296 | 26 8589934592 | 20 17179869184 | 19 34359738368 | 7 68719476736 | 2 137438953472 | 0 iCald value ------------- Distribution ------------- count 8388608 | 0 16777216 |@@@@@@@ 20 33554432 |@@@ 9 67108864 |@@ 8 134217728 |@@@@@ 16 268435456 |@@@@ 11 536870912 |@@@@ 11 1073741824 |@ 4 2147483648 | 2 4294967296 | 0 8589934592 |@@ 8 17179869184 |@ 5 34359738368 |@ 4 68719476736 |@@ 6 137438953472 |@ 4 274877906944 | 2 549755813888 | 0
25.3.4. signal-send
You can use the signal-send
probe to determine
the sending and receiving process associated with any signal, as shown in
the following example:
#pragma D option quiet
proc:::signal-send
{
@[execname, stringof(args[1]->pr_fname), args[2]] = count();
}
END
{
printf("%20s %20s %12s %s\n",
"SENDER", "RECIPIENT", "SIG", "COUNT");
printa("%20s %20s %12d %@d\n", @);
}
Running this script results in output similar to the following example:
# dtrace -s ./sig.d ^C SENDER RECIPIENT SIG COUNT xterm dtrace 2 1 xterm soffice.bin 2 1 tr init 18 1 sched test 18 1 sched fvwm2 18 1 bash bash 20 1 sed init 18 2 sched ksh 18 15 sched Xsun 22 471
25.4. Stability
The proc
provider
uses DTrace's stability mechanism to describe its stabilities, as shown in
the following table. For more information about the stability mechanism, see Stability.
Element |
Name stability |
Data stability |
Dependency class |
---|---|---|---|
Provider |
Evolving |
Evolving |
ISA |
Module |
Private |
Private |
Unknown |
Function |
Private |
Private |
Unknown |
Name |
Evolving |
Evolving |
ISA |
Arguments |
Evolving |
Evolving |
ISA |