xref: /freebsd/share/man/man4/dtrace_dtrace.4 (revision a487606afd9b7c21d76fce29c43b53c7c7a3a8eb)
1*a487606aSMateusz Piotrowski.\"
2*a487606aSMateusz Piotrowski.\" SPDX-License-Identifier: BSD-2-Clause
3*a487606aSMateusz Piotrowski.\"
4*a487606aSMateusz Piotrowski.\" Copyright (c) 2025 Mateusz Piotrowski <0mp@FreeBSD.org>
5*a487606aSMateusz Piotrowski.\"
6*a487606aSMateusz Piotrowski.Dd July 14, 2025
7*a487606aSMateusz Piotrowski.Dt DTRACE_DTRACE 4
8*a487606aSMateusz Piotrowski.Os
9*a487606aSMateusz Piotrowski.Sh NAME
10*a487606aSMateusz Piotrowski.Nm dtrace_dtrace
11*a487606aSMateusz Piotrowski.Nd a DTrace provider for BEGIN, END, and ERROR probes
12*a487606aSMateusz Piotrowski.Sh SYNOPSIS
13*a487606aSMateusz Piotrowski.Nm dtrace Ns Cm :::BEGIN
14*a487606aSMateusz Piotrowski.Nm dtrace Ns Cm :::END
15*a487606aSMateusz Piotrowski.Nm dtrace Ns Cm :::ERROR
16*a487606aSMateusz Piotrowski.Sh DESCRIPTION
17*a487606aSMateusz PiotrowskiThe
18*a487606aSMateusz Piotrowski.Nm dtrace
19*a487606aSMateusz Piotrowskiprovider implements three special probes related to the life cycle of the
20*a487606aSMateusz PiotrowskiDTrace program itself.
21*a487606aSMateusz Piotrowski.Ss dtrace:::BEGIN
22*a487606aSMateusz PiotrowskiThe
23*a487606aSMateusz Piotrowski.Nm dtrace Ns Cm :::BEGIN
24*a487606aSMateusz Piotrowskiprobe fires at the beginning of a
25*a487606aSMateusz Piotrowski.Xr dtrace 1 ,
26*a487606aSMateusz Piotrowskiprogram before tracing has begun.
27*a487606aSMateusz PiotrowskiIt provides a convenient place for initializing variables
28*a487606aSMateusz Piotrowskiand printing column headers.
29*a487606aSMateusz Piotrowski.Pp
30*a487606aSMateusz PiotrowskiVariables such as
31*a487606aSMateusz Piotrowski.Va stack
32*a487606aSMateusz Piotrowskior
33*a487606aSMateusz Piotrowski.Va execname
34*a487606aSMateusz Piotrowskicannot be relied upon in the execution context of the
35*a487606aSMateusz Piotrowski.Nm dtrace Ns Cm :::BEGIN
36*a487606aSMateusz Piotrowskiprobe.
37*a487606aSMateusz Piotrowski.Ss dtrace:::END
38*a487606aSMateusz PiotrowskiThe
39*a487606aSMateusz Piotrowski.Nm dtrace Ns Cm :::END
40*a487606aSMateusz Piotrowskiprobe fires at the end of a
41*a487606aSMateusz Piotrowski.Xr dtrace 1
42*a487606aSMateusz Piotrowskiprogram, when all tracing has stopped.
43*a487606aSMateusz Piotrowski.Ss dtrace:::ERROR
44*a487606aSMateusz PiotrowskiThe
45*a487606aSMateusz Piotrowski.Nm dtrace Ns Cm :::ERROR
46*a487606aSMateusz Piotrowskiprobe fires when an unexpected runtime error occurs in another probe.
47*a487606aSMateusz Piotrowski.Pp
48*a487606aSMateusz PiotrowskiThe following table describes the arguments to
49*a487606aSMateusz Piotrowski.Nm dtrace Ns Cm :::ERROR .
50*a487606aSMateusz Piotrowski.Bl -column -offset indent "Argument" "Definition"
51*a487606aSMateusz Piotrowski.It Sy Argument Ta Sy Definition
52*a487606aSMateusz Piotrowski.It Fa arg1  Ta Enabled probe identifier (EPID)
53*a487606aSMateusz Piotrowskiof the probe where the runtime error occurred
54*a487606aSMateusz Piotrowski.It Fa arg2  Ta Index of the action statement that caused the error
55*a487606aSMateusz Piotrowski.It Fa arg3  Ta DIF offset into the action if available (otherwise -1)
56*a487606aSMateusz Piotrowski.It Fa arg4  Ta Fault type
57*a487606aSMateusz Piotrowski.It Fa arg5  Ta Accessed address (or 0 if not applicable) when
58*a487606aSMateusz Piotrowski.Va arg4
59*a487606aSMateusz Piotrowskiis of fault type
60*a487606aSMateusz Piotrowski.Dv DTRACEFLT_BADADDR , DTRACEFLT_BADALIGN , DTRACEFLT_KPRIV ,
61*a487606aSMateusz Piotrowskior
62*a487606aSMateusz Piotrowski.Dv DTRACEFLT_UPRIV
63*a487606aSMateusz Piotrowski.El
64*a487606aSMateusz Piotrowski.Pp
65*a487606aSMateusz PiotrowskiThe fault types are:
66*a487606aSMateusz Piotrowski.Bl -tag -offset indent -width "DTRACEFLT_NOSCRATCH" -compact
67*a487606aSMateusz Piotrowski.It Dv DTRACEFLT_UNKNOWN
68*a487606aSMateusz PiotrowskiUnknown fault
69*a487606aSMateusz Piotrowski.It Dv DTRACEFLT_BADADDR
70*a487606aSMateusz PiotrowskiBad address
71*a487606aSMateusz Piotrowski.It Dv DTRACEFLT_BADALIGN
72*a487606aSMateusz PiotrowskiBad alignment
73*a487606aSMateusz Piotrowski.It Dv DTRACEFLT_ILLOP
74*a487606aSMateusz PiotrowskiIllegal operation
75*a487606aSMateusz Piotrowski.It Dv DTRACEFLT_DIVZERO
76*a487606aSMateusz PiotrowskiDivide-by-zero
77*a487606aSMateusz Piotrowski.It Dv DTRACEFLT_NOSCRATCH
78*a487606aSMateusz PiotrowskiOut of scratch space
79*a487606aSMateusz Piotrowski.It Dv DTRACEFLT_KPRIV
80*a487606aSMateusz PiotrowskiIllegal kernel access
81*a487606aSMateusz Piotrowski.It Dv DTRACEFLT_UPRIV
82*a487606aSMateusz PiotrowskiIllegal user access
83*a487606aSMateusz Piotrowski.It Dv DTRACEFLT_TUPOFLOW
84*a487606aSMateusz PiotrowskiTuple stack overflow
85*a487606aSMateusz Piotrowski.It Dv DTRACEFLT_BADSTACK
86*a487606aSMateusz PiotrowskiBad stack
87*a487606aSMateusz Piotrowski.El
88*a487606aSMateusz Piotrowski.Sh FILES
89*a487606aSMateusz Piotrowski.Bl -tag -width '<sys/dtrace.h>'
90*a487606aSMateusz Piotrowski.It In sys/dtrace.h
91*a487606aSMateusz PiotrowskiThe header file containing the definitions of DTrace fault types.
92*a487606aSMateusz Piotrowski.El
93*a487606aSMateusz Piotrowski.Sh EXAMPLES
94*a487606aSMateusz Piotrowski.Ss Example 1 : Custom Column Headers
95*a487606aSMateusz PiotrowskiThe following script uses the
96*a487606aSMateusz Piotrowski.Nm dtrace Ns Cm :::BEGIN
97*a487606aSMateusz Piotrowskiprobe to print column headers.
98*a487606aSMateusz PiotrowskiNote the pragma line setting the
99*a487606aSMateusz Piotrowski.Ql quiet
100*a487606aSMateusz Piotrowskioption to disable the default column headers.
101*a487606aSMateusz Piotrowski.Bd -literal -offset 2n
102*a487606aSMateusz Piotrowski#pragma D option quiet
103*a487606aSMateusz Piotrowski
104*a487606aSMateusz Piotrowskidtrace:::BEGIN
105*a487606aSMateusz Piotrowski{
106*a487606aSMateusz Piotrowski    printf("   %12s %-20s    %-20s %s\en",
107*a487606aSMateusz Piotrowski        "DELTA(us)", "OLD", "NEW", "TIMESTAMP");
108*a487606aSMateusz Piotrowski}
109*a487606aSMateusz Piotrowski.Ed
110*a487606aSMateusz Piotrowski.Ss Example 2 : Handling Runtime Errors with dtrace:::ERROR
111*a487606aSMateusz PiotrowskiThe following script causes a runtime error by dereferencing a pointer
112*a487606aSMateusz Piotrowskion address
113*a487606aSMateusz Piotrowski.Ad 19930908
114*a487606aSMateusz Piotrowskiin the
115*a487606aSMateusz Piotrowski.Cm BEGIN
116*a487606aSMateusz Piotrowskiprobe.
117*a487606aSMateusz PiotrowskiAs a result, the
118*a487606aSMateusz Piotrowski.Cm ERROR
119*a487606aSMateusz Piotrowskiprobe fires and prints out
120*a487606aSMateusz Piotrowski.Dq Oops
121*a487606aSMateusz Piotrowskialong with the probe arguments.
122*a487606aSMateusz PiotrowskiAt that point, the program ends and fires the
123*a487606aSMateusz Piotrowski.Cm END
124*a487606aSMateusz Piotrowskiprobe.
125*a487606aSMateusz Piotrowski.\" It might look weird to define ERROR first, but that is on purpose.
126*a487606aSMateusz Piotrowski.\" This way the probe IDs and EPIDs are a bit more mixed up
127*a487606aSMateusz Piotrowski.\" and are easier to understand.
128*a487606aSMateusz Piotrowski.Bd -literal -offset 2n
129*a487606aSMateusz PiotrowskiERROR
130*a487606aSMateusz Piotrowski{
131*a487606aSMateusz Piotrowski    printf("Oops\en");
132*a487606aSMateusz Piotrowski    printf("EPID (arg1): %d\en", arg1);
133*a487606aSMateusz Piotrowski    printf("Action index (arg2): %d\en", arg2);
134*a487606aSMateusz Piotrowski    printf("DIF offset (arg3): %d\en", arg3);
135*a487606aSMateusz Piotrowski    printf("Fault type (arg4): %d\en", arg4);
136*a487606aSMateusz Piotrowski    printf("Accessed address (arg5): %X\en", arg5);
137*a487606aSMateusz Piotrowski    exit(1);
138*a487606aSMateusz Piotrowski}
139*a487606aSMateusz PiotrowskiBEGIN
140*a487606aSMateusz Piotrowski{
141*a487606aSMateusz Piotrowski    *(int *)0x19931101;
142*a487606aSMateusz Piotrowski}
143*a487606aSMateusz PiotrowskiEND {
144*a487606aSMateusz Piotrowski    printf("Bye");
145*a487606aSMateusz Piotrowski}
146*a487606aSMateusz Piotrowski.Ed
147*a487606aSMateusz Piotrowski.Pp
148*a487606aSMateusz PiotrowskiThis script will result in the following output:
149*a487606aSMateusz Piotrowski.Bd -literal -offset 2n
150*a487606aSMateusz PiotrowskiCPU     ID                    FUNCTION:NAME
151*a487606aSMateusz Piotrowski  2      3                           :ERROR Oops
152*a487606aSMateusz PiotrowskiEPID (arg1): 2
153*a487606aSMateusz PiotrowskiAction index (arg2): 1
154*a487606aSMateusz PiotrowskiDIF offset (arg3): 16
155*a487606aSMateusz PiotrowskiFault type: 1
156*a487606aSMateusz Piotrowskiarg5: 19931101
157*a487606aSMateusz Piotrowski
158*a487606aSMateusz Piotrowskidtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): invalid address (0x19931101) in action #1 at DIF offset 16
159*a487606aSMateusz Piotrowski  2      2                             :END Bye
160*a487606aSMateusz Piotrowski.Ed
161*a487606aSMateusz Piotrowski.Sh SEE ALSO
162*a487606aSMateusz Piotrowski.Xr dtrace 1 ,
163*a487606aSMateusz Piotrowski.Xr tracing 7
164*a487606aSMateusz Piotrowski.Rs
165*a487606aSMateusz Piotrowski.%B The illumos Dynamic Tracing Guide
166*a487606aSMateusz Piotrowski.%O Chapter dtrace Provider
167*a487606aSMateusz Piotrowski.%D 2008
168*a487606aSMateusz Piotrowski.%U https://illumos.org/books/dtrace/chp-dtrace.html
169*a487606aSMateusz Piotrowski.Re
170*a487606aSMateusz Piotrowski.Sh AUTHORS
171*a487606aSMateusz PiotrowskiThis manual page was written by
172*a487606aSMateusz Piotrowski.An Mateusz Piotrowski Aq Mt 0mp@FreeBSD.org .
173*a487606aSMateusz Piotrowski.Sh CAVEATS
174*a487606aSMateusz PiotrowskiThe
175*a487606aSMateusz Piotrowski.Nm dtrace Ns Cm :::ERROR
176*a487606aSMateusz Piotrowskiprobe arguments cannot be accessed through the typed
177*a487606aSMateusz Piotrowski.Va args[]
178*a487606aSMateusz Piotrowskiarray.
179*a487606aSMateusz Piotrowski.Pp
180*a487606aSMateusz Piotrowski.Xr dtrace 1
181*a487606aSMateusz Piotrowskiwill not fire the
182*a487606aSMateusz Piotrowski.Nm dtrace Ns Cm :::ERROR
183*a487606aSMateusz Piotrowskiprobe recursively.
184*a487606aSMateusz PiotrowskiIf an error occurs in one of the action statements of the
185*a487606aSMateusz Piotrowski.Nm dtrace Ns Cm :::ERROR ,
186*a487606aSMateusz Piotrowskithen
187*a487606aSMateusz Piotrowski.Xr dtrace 1
188*a487606aSMateusz Piotrowskiwill abort further processing of
189*a487606aSMateusz Piotrowskithe
190*a487606aSMateusz Piotrowski.Nm dtrace Ns Cm :::ERROR
191*a487606aSMateusz Piotrowskiprobe's actions.
192