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