DTrace Provider
The dtrace
provider includes several probes that are specific to
DTrace itself.
Use these probes to initialize state before tracing begins, process state after tracing has completed, and to handle unexpected execution errors in other probes.
BEGIN Probe
The BEGIN
probe fires before any other probe.
No other probe fires until all BEGIN
clauses have completed. This probe can
be used to initialize any state that's needed in other probes. The following example shows
how to use the BEGIN
probe to initialize an associative array to map
between mmap()
protection bits and a textual representation:
dtrace:::BEGIN
{
prot[0] = "---";
prot[1] = "r--";
prot[2] = "-w-";
prot[3] = "rw-";
prot[4] = "--x";
prot[5] = "r-x";
prot[6] = "-wx";
prot[7] = "rwx";
}
syscall::mmap:entry
{
printf("mmap with prot = %s", prot[arg2 & 0x7]);
}
The BEGIN
probe fires in an unspecified
context, which means the output of stack
or
ustack
, and the value of context-specific
variables such as execname
, are all
arbitrary. These values should not be relied upon or interpreted
to infer any meaningful information. No arguments are defined
for the BEGIN
probe.
END Probe
The END
probe fires after all other probes.
This probe doesn't fire until all other probe clauses have completed. This probe can be
used to process state that has been gathered or to format the output. The
printa
function is therefore often used in the END
probe. The BEGIN
and END
probes can be used together to
measure the total time that's spent tracing, for example:
dtrace:::BEGIN
{
start = timestamp;
}
/*
* ... other tracing functions...
*/
dtrace:::END
{
printf("total time: %d secs", (timestamp - start) / 1000000000);
}
As with the BEGIN
probe, no arguments are defined for the
END
probe. The context in which the END
probe fires is
arbitrary and can't be depended upon.
Note:
The exit
function causes tracing to stop and the END
probe to fire. However, a
delay exists between the invocation of the exit
function and when the
END
probe fires. During this delay, no further probes can fire. After a
probe invokes the exit
function, the END
probe isn't
fired until DTrace determines that exit
has been called and stops
tracing. The rate at which the exit status is checked can be set by using
statusrate option.
ERROR Probe
The ERROR
probe fires when a runtime error occurs during the
processing of a clause for a DTrace probe.
When a runtime error occurs, DTrace doesn't process the rest of the clause that resulted
in the error. If an ERROR probe is included in the script, it's triggered immediately. After
the ERROR probe is processed, tracing continues. If you want a D runtime error to stop all
further tracing, you must include an exit()
action in the clause for the
ERROR probe.
In the following example, a clause attempts to dereference a NULL
pointer
and causes the ERROR
probe to fire. Save it in a file named
error.d
:
dtrace:::BEGIN
{
*(char *)NULL;
}
dtrace:::ERROR
{
printf("Hit an error!");
}
When you run this program, output similar to the following is displayed:
dtrace: script 'error.d' matched 2 probes
dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (0x0) in action #1 at BPF pc 142
CPU ID FUNCTION:NAME
0 3 :ERROR Hit an error!
The output indicates that the ERROR
probe fired and that
dtrace reported the error. dtrace has its own
enabling of the ERROR
probe so that it can report errors. Using the
ERROR
probe, you can create custom error handling.
The arguments to the ERROR
probe are
described in the following table.
Argument | Description |
---|---|
|
The enabled probe identifier (EPID) of the probe that caused the error. |
|
The index of the action that caused the fault. |
|
The DIF offset into the action or -1 if not applicable. |
|
The fault type. |
|
Value that's particular to the fault type. |
The following table describes the various fault types that can
be specified in arg4
and the values that
arg5
can take for each fault type.
arg4 Value | Description | arg5 Meaning |
---|---|---|
|
Unknown fault type |
None |
|
Access to unmapped or invalid address |
Address accessed |
|
Unaligned memory access |
Address accessed |
|
Illegal or invalid operation |
None |
|
Integer divide by zero |
None |
|
Insufficient scratch memory to satisfy scratch allocation |
None |
|
Attempt to access a kernel address or property without sufficient privileges |
Address accessed or 0 if not applicable |
|
Attempt to access a user address or property without sufficient privileges |
Address accessed or 0 if not applicable |
|
DTrace internal parameter tuple stack overflow |
None |
|
Invalid user process stack |
Address of invalid stack pointer |
DTRACEFLT_BADSIZE
|
Invalid size fault that appears when an invalid size is passed to a function
such as alloca() , bcopy() or
copyin() .
|
The invalid size. |
DTRACEFLT_BADINDEX
|
Index out of bounds in a scalar array. | The index that was specified. |
DTRACEFLT_LIBRARY
|
Library level fault | None. |
If the actions that are taken in the ERROR
probe cause an error, that error
is silently dropped. The ERROR
probe isn't recursively invoked.
dtrace Stability
The dtrace
provider uses DTrace's stability mechanism to describe its
stabilities. These values are listed in the following table.
Element | Name Stability | Data Stability | Dependency Class |
---|---|---|---|
Provider |
Stable |
Stable |
Common |
Module |
Private |
Private |
Unknown |
Function |
Private |
Private |
Unknown |
Name |
Stable |
Stable |
Common |
Arguments |
Stable |
Stable |
Common |