1*521fa314SDavid van Moolenbroek.Dd November 2, 2014 2*521fa314SDavid van Moolenbroek.Dt TRACE 1 3*521fa314SDavid van Moolenbroek.Os 4*521fa314SDavid van Moolenbroek.Sh NAME 5*521fa314SDavid van Moolenbroek.Nm trace 6*521fa314SDavid van Moolenbroek.Nd print process system calls and signals 7*521fa314SDavid van Moolenbroek.Sh SYNOPSIS 8*521fa314SDavid van Moolenbroek.Nm 9*521fa314SDavid van Moolenbroek.Op Fl fgNsVv 10*521fa314SDavid van Moolenbroek.Op Fl o Ar file 11*521fa314SDavid van Moolenbroek.Op Fl p Ar pid 12*521fa314SDavid van Moolenbroek.Op Ar command 13*521fa314SDavid van Moolenbroek.Sh DESCRIPTION 14*521fa314SDavid van MoolenbroekThe 15*521fa314SDavid van Moolenbroek.Nm 16*521fa314SDavid van Moolenbroekutility shows one or more processes to be traced. 17*521fa314SDavid van MoolenbroekFor each traced process, 18*521fa314SDavid van Moolenbroek.Nm 19*521fa314SDavid van Moolenbroekprints the system calls the process makes and the signals 20*521fa314SDavid van Moolenbroekit receives. 21*521fa314SDavid van MoolenbroekThe user can let 22*521fa314SDavid van Moolenbroek.Nm 23*521fa314SDavid van Moolenbroekstart a 24*521fa314SDavid van Moolenbroek.Ar command 25*521fa314SDavid van Moolenbroekto be traced, and/or attach to one or more existing processes. 26*521fa314SDavid van Moolenbroek.Pp 27*521fa314SDavid van MoolenbroekThe utility will run until no processes are left to trace, or until the user 28*521fa314SDavid van Moolenbroekpresses the interrupt key (typically Ctrl-C). 29*521fa314SDavid van MoolenbroekPressing this key once will cause all attached processes to be detached, with 30*521fa314SDavid van Moolenbroekthe hope that the command that was started will also terminate cleanly from the 31*521fa314SDavid van Moolenbroekinterruption. 32*521fa314SDavid van MoolenbroekPressing the interrupt key once more kills the command that was started. 33*521fa314SDavid van Moolenbroek.Pp 34*521fa314SDavid van MoolenbroekThe following options are available: 35*521fa314SDavid van Moolenbroek.Bl -tag -width XoXfileXX 36*521fa314SDavid van Moolenbroek.It Fl f 37*521fa314SDavid van MoolenbroekFollow forks. 38*521fa314SDavid van MoolenbroekAttach automatically to forked child processes. 39*521fa314SDavid van MoolenbroekChild processes of the started command will be treated as attached processes, 40*521fa314SDavid van Moolenbroekin that upon Ctrl-C presses they will be detached rather than killed. 41*521fa314SDavid van Moolenbroek.It Fl g 42*521fa314SDavid van MoolenbroekEnable call grouping. 43*521fa314SDavid van MoolenbroekWith this option, the tracing engine tries to reduce noise from call preemption 44*521fa314SDavid van Moolenbroekby first polling the process that was active last. 45*521fa314SDavid van MoolenbroekThis should reduce in cleaner output, but may also cause a single process to be 46*521fa314SDavid van Moolenbroekscheduled repeatedly and thus cause starvation. 47*521fa314SDavid van Moolenbroek.It Fl N 48*521fa314SDavid van MoolenbroekPrint all names. 49*521fa314SDavid van MoolenbroekBy default, the most structure fields are printed with their name. 50*521fa314SDavid van MoolenbroekThis option enables printing of all available names, which also includes 51*521fa314SDavid van Moolenbroeksystem call parameter names. 52*521fa314SDavid van MoolenbroekThis flag may be useful to figure out the meaning of a parameter, and for 53*521fa314SDavid van Moolenbroekautomatic processing of the output. 54*521fa314SDavid van Moolenbroek.It Fl s 55*521fa314SDavid van MoolenbroekPrint stack traces. 56*521fa314SDavid van MoolenbroekEach system call, and each signal arriving outside a system call, will be 57*521fa314SDavid van Moolenbroekpreceded by a line showing the process's current stack trace. 58*521fa314SDavid van MoolenbroekFor signals blocked by the target process, the stack trace may not be 59*521fa314SDavid van Moolenbroekmeaningful. 60*521fa314SDavid van MoolenbroekStack traces may not be supported on all platforms. 61*521fa314SDavid van Moolenbroek.It Fl V 62*521fa314SDavid van MoolenbroekPrint values only. 63*521fa314SDavid van MoolenbroekIf this flag is given once, numerical values will be printed instead of 64*521fa314SDavid van Moolenbroekstring constants. 65*521fa314SDavid van MoolenbroekIn addition, if it is given twice, the addresses of structures will be printed 66*521fa314SDavid van Moolenbroekinstead of their contents. 67*521fa314SDavid van Moolenbroek.It Fl v 68*521fa314SDavid van MoolenbroekIncrease verbosity. 69*521fa314SDavid van MoolenbroekBy default, the output will be terse, in that not all structure fields are 70*521fa314SDavid van Moolenbroekshown, and strings and arrays are not always printed in full. 71*521fa314SDavid van MoolenbroekIf this flag is provided once, more and longer output will be printed. 72*521fa314SDavid van MoolenbroekIf it is provided twice, the tracer will print as much as possible. 73*521fa314SDavid van Moolenbroek.It Fl o Ar file 74*521fa314SDavid van MoolenbroekRedirect output. 75*521fa314SDavid van MoolenbroekBy default, the output is sent to standard error. 76*521fa314SDavid van MoolenbroekWith this option, the output is written to the given 77*521fa314SDavid van Moolenbroek.Ar file 78*521fa314SDavid van Moolenbroekinstead. 79*521fa314SDavid van Moolenbroek.It Fl p Ar pid 80*521fa314SDavid van MoolenbroekAttach to a process. 81*521fa314SDavid van MoolenbroekThis option makes 82*521fa314SDavid van Moolenbroek.Nm 83*521fa314SDavid van Moolenbroekattach to an existing process with process ID 84*521fa314SDavid van Moolenbroek.Ar pid . 85*521fa314SDavid van MoolenbroekThis option may be used multiple times. 86*521fa314SDavid van MoolenbroekWhen attaching to one or more processes this way, starting a command becomes 87*521fa314SDavid van Moolenbroekoptional. 88*521fa314SDavid van Moolenbroek.El 89*521fa314SDavid van Moolenbroek.Pp 90*521fa314SDavid van MoolenbroekIf the user presses the information key (typically Ctrl-T), the list of traced 91*521fa314SDavid van Moolenbroekprocess along with their current status will be printed. 92*521fa314SDavid van Moolenbroek.Sh OUTPUT FORMAT 93*521fa314SDavid van MoolenbroekSystem calls are printed with the following general output format: 94*521fa314SDavid van Moolenbroek.Bd -literal -offset indent 95*521fa314SDavid van Moolenbroek.Sy name Ns ( Ns Sy parameters Ns ) = Sy result 96*521fa314SDavid van Moolenbroek.Ed 97*521fa314SDavid van Moolenbroek.Pp 98*521fa314SDavid van MoolenbroekOther informational lines may be printed about the status of the process. 99*521fa314SDavid van MoolenbroekThese lines typically start with an uppercase letter, while system calls 100*521fa314SDavid van Moolenbroekalways start with a lowercase letter or an underscore. 101*521fa314SDavid van MoolenbroekThe following example shows the tracer output for a program that prints its 102*521fa314SDavid van Moolenbroekown user ID: 103*521fa314SDavid van Moolenbroek.Bd -literal -offset indent 104*521fa314SDavid van MoolenbroekTracing printuid (pid 12685) 105*521fa314SDavid van Moolenbroekminix_getinfo() = 0 106*521fa314SDavid van Moolenbroekgetuid() = 0 (euid=1) 107*521fa314SDavid van Moolenbroekwrite(1, "My uid: 0\en", 10) = 10 108*521fa314SDavid van Moolenbroekexit(0) 109*521fa314SDavid van MoolenbroekProcess exited normally with code 0 110*521fa314SDavid van Moolenbroek.Ed 111*521fa314SDavid van Moolenbroek.Pp 112*521fa314SDavid van MoolenbroekThe first and last lines of the output provide status information about the 113*521fa314SDavid van Moolenbroektraced process. 114*521fa314SDavid van MoolenbroekSome calls return multiple results; extended results are printed in parentheses 115*521fa314SDavid van Moolenbroekafter the primary call result, typically in 116*521fa314SDavid van Moolenbroek.Va name Ns = Ns Va value 117*521fa314SDavid van Moolenbroekformat for clarity. 118*521fa314SDavid van MoolenbroekSystem calls that do not return on success, such as 119*521fa314SDavid van Moolenbroek.Fn exit , 120*521fa314SDavid van Moolenbroekare printed without the equals sign and result, unless they fail. 121*521fa314SDavid van MoolenbroekSystem call failure is printed according to POSIX conventions; that is, the 122*521fa314SDavid van Moolenbroekcall is assumed to return -1 with the value of 123*521fa314SDavid van Moolenbroek.Va errno 124*521fa314SDavid van Moolenbroekprinted in square brackets after it: 125*521fa314SDavid van Moolenbroek.Bd -literal -offset indent 126*521fa314SDavid van Moolenbroeksetuid(0) = -1 [EPERM] 127*521fa314SDavid van Moolenbroek.Ed 128*521fa314SDavid van Moolenbroek.Pp 129*521fa314SDavid van MoolenbroekIf a system call ends up in an IPC-level failure, the -1 value will be preceded 130*521fa314SDavid van Moolenbroekby an 131*521fa314SDavid van Moolenbroek.Dq Li <ipc> 132*521fa314SDavid van Moolenbroekstring. 133*521fa314SDavid van MoolenbroekHowever, this string will be omitted if the system call itself is printed at 134*521fa314SDavid van Moolenbroekthe IPC level (that is, as an 135*521fa314SDavid van Moolenbroek.Fn ipc_sendrec 136*521fa314SDavid van Moolenbroekcall), generally because 137*521fa314SDavid van Moolenbroek.Nm 138*521fa314SDavid van Moolenbroekhas no handler to print the actual system call. 139*521fa314SDavid van Moolenbroek.Pp 140*521fa314SDavid van MoolenbroekSignals are printed as they arrive at the traced process, using two asterisks 141*521fa314SDavid van Moolenbroekon both side of the signal name. 142*521fa314SDavid van MoolenbroekSignals may arrive both during and outside the execution of a system call: 143*521fa314SDavid van Moolenbroek.Bd -literal -offset indent 144*521fa314SDavid van Moolenbroekread(3, ** SIGUSR1 ** &0xeffff867, 4096) = -1 [EINTR] 145*521fa314SDavid van Moolenbroek** SIGUSR2 ** 146*521fa314SDavid van Moolenbroekgetpid() = 5278 (ppid=5277) 147*521fa314SDavid van Moolenbroekkill(5278, SIGTERM) = ** SIGTERM ** <..> 148*521fa314SDavid van MoolenbroekProcess terminated from signal SIGTERM 149*521fa314SDavid van Moolenbroek.Ed 150*521fa314SDavid van Moolenbroek.Pp 151*521fa314SDavid van MoolenbroekMultiple signals may be printed consecutively. 152*521fa314SDavid van MoolenbroekThe above example illustrates a few other important aspects of output 153*521fa314SDavid van Moolenbroekformatting. 154*521fa314SDavid van MoolenbroekSome call parameters may be printed only after the system call returns, in 155*521fa314SDavid van Moolenbroekorder to show their actual value. 156*521fa314SDavid van MoolenbroekFor the 157*521fa314SDavid van Moolenbroek.Fn read 158*521fa314SDavid van Moolenbroekcall, this would be the bytes that were read. 159*521fa314SDavid van MoolenbroekUpon failure, no bytes were read, so the buffer pointer is printed instead. 160*521fa314SDavid van MoolenbroekFinally, if a call that is expected to return (here, 161*521fa314SDavid van Moolenbroek.Fn kill ) 162*521fa314SDavid van Moolenbroekdoes not return before the process terminates, the line ends with a 163*521fa314SDavid van Moolenbroek.Dq Li <..> 164*521fa314SDavid van Moolenbroekmarker. 165*521fa314SDavid van MoolenbroekThis is an instance of call preemption; more about that later. 166*521fa314SDavid van Moolenbroek.Pp 167*521fa314SDavid van MoolenbroekPointers are printed with a 168*521fa314SDavid van Moolenbroek.Sq Li & 169*521fa314SDavid van Moolenbroekprefix, except for NULL, which is printed using its own name. 170*521fa314SDavid van MoolenbroekIn general, named constants are used instead of numerical constants wherever 171*521fa314SDavid van Moolenbroekthat makes sense. 172*521fa314SDavid van MoolenbroekFor pointers of which the address is not available, typically because its 173*521fa314SDavid van Moolenbroekcontents are passed by value, 174*521fa314SDavid van Moolenbroek.Dq Li &.. 175*521fa314SDavid van Moolenbroekis shown instead. 176*521fa314SDavid van Moolenbroek.Pp 177*521fa314SDavid van MoolenbroekData buffers are printed as double-quoted strings, using C-style character 178*521fa314SDavid van Moolenbroekescaping for nontextual bytes. 179*521fa314SDavid van MoolenbroekIf either the verbosity level or a copy error prevents the whole data buffer 180*521fa314SDavid van Moolenbroekfrom being printed, two dots will be printed after the closing quote. 181*521fa314SDavid van MoolenbroekThe same is done when printing a string buffer which does not have a null 182*521fa314SDavid van Moolenbroektermination byte within its range. 183*521fa314SDavid van MoolenbroekPath names are shown in full regardless of the verbosity level. 184*521fa314SDavid van Moolenbroek.Pp 185*521fa314SDavid van MoolenbroekStructures are printed as a set of structure fields enclosed in curly brackets. 186*521fa314SDavid van MoolenbroekThe 187*521fa314SDavid van Moolenbroek.Va name Ns = Ns Va value 188*521fa314SDavid van Moolenbroekformat is used, unless printing names for that structure type would introduce 189*521fa314SDavid van Moolenbroektoo much noise and the 190*521fa314SDavid van Moolenbroek.Dq print all names 191*521fa314SDavid van Moolenbroekoption is not given. 192*521fa314SDavid van MoolenbroekFor many structures, by default only a subset of their fields are printed. 193*521fa314SDavid van MoolenbroekIn this case, a 194*521fa314SDavid van Moolenbroek.Dq Li .. 195*521fa314SDavid van Moolenbroekentry is added at the end. 196*521fa314SDavid van MoolenbroekIn some cases, an attempt is made to print only the most useful fields: 197*521fa314SDavid van Moolenbroek.Bd -literal -offset indent 198*521fa314SDavid van Moolenbroekstat("/etc/motd", {st_mode=S_IFREG|0755, st_size=747, ..}) = 0 199*521fa314SDavid van Moolenbroekstat("/dev/tty", {st_mode=S_IFCHR|0666, st_rdev=<5,0>, ..}) = 0 200*521fa314SDavid van Moolenbroek.Ed 201*521fa314SDavid van Moolenbroek.Pp 202*521fa314SDavid van MoolenbroekAs shown in the above example, flag fields are printed as a combination of 203*521fa314SDavid van Moolenbroeknamed constants, separated by a 204*521fa314SDavid van Moolenbroek.Sq Li | 205*521fa314SDavid van Moolenbroekpipe symbol. 206*521fa314SDavid van MoolenbroekAny leftover numerical bits are printed at the end. 207*521fa314SDavid van MoolenbroekThe example also shows the format in which major/minor pairs are printed for 208*521fa314SDavid van Moolenbroekdevice numbers. 209*521fa314SDavid van MoolenbroekThis is a custom format; there are a few other custom formats throughout the 210*521fa314SDavid van Moolenbroek.Nm 211*521fa314SDavid van Moolenbroekoutput which are supposed to be sufficiently self-explanatory (and rare). 212*521fa314SDavid van Moolenbroek.Pp 213*521fa314SDavid van MoolenbroekArrays are printed using square brackets. 214*521fa314SDavid van Moolenbroek.Bd -literal -offset indent 215*521fa314SDavid van Moolenbroekpipe2([3, 4], 0) = 0 216*521fa314SDavid van Moolenbroekgetdents(3, [..(45)], 4096) = 1824 217*521fa314SDavid van Moolenbroekgetdents(3, [{d_name="."}, ..(+44)], 4096) = 1824 218*521fa314SDavid van Moolenbroekgetdents(3, [], 4096) = 0 219*521fa314SDavid van Moolenbroek.Ed 220*521fa314SDavid van Moolenbroek.Pp 221*521fa314SDavid van MoolenbroekIf the array contents are not printed as per the settings for the verbosity 222*521fa314SDavid van Moolenbroeklevel, a single pseudo-element shows how many actual elements were in the array 223*521fa314SDavid van Moolenbroek(the second line in the example). 224*521fa314SDavid van MoolenbroekIf the number of printed elements is limited, a final pseudo-element shows how 225*521fa314SDavid van Moolenbroekmany additional elements were not printed (the third line in the example). 226*521fa314SDavid van MoolenbroekIf a copy error occurs while part of the array has been printed already, a 227*521fa314SDavid van Moolenbroeklast 228*521fa314SDavid van Moolenbroek.Dq Li ..(?) 229*521fa314SDavid van Moolenbroekpseudo-element is printed; for immediate failure, the array's pointer is shown. 230*521fa314SDavid van MoolenbroekEmpty arrays will be printed as 231*521fa314SDavid van Moolenbroek.Dq Li [] . 232*521fa314SDavid van Moolenbroek.Pp 233*521fa314SDavid van MoolenbroekBit sets are printed as arrays except with just a space and no comma as 234*521fa314SDavid van Moolenbroekbit separator, closely following the output format of 235*521fa314SDavid van Moolenbroek.Nm Ns 's 236*521fa314SDavid van Moolenbroekoriginal inspiration 237*521fa314SDavid van Moolenbroek.Sy strace . 238*521fa314SDavid van MoolenbroekFor signal sets in particular, an inverted bit set may be shown, thus printing 239*521fa314SDavid van Moolenbroekonly the bits which are not set; such sets are prefixed with a 240*521fa314SDavid van Moolenbroek.Sq Li ~ 241*521fa314SDavid van Moolenbroekto the opening bracket: 242*521fa314SDavid van Moolenbroek.Bd -literal -offset indent 243*521fa314SDavid van Moolenbroeksigprocmask(SIG_SETMASK, ~[USR1 USR2], []) = 0 244*521fa314SDavid van Moolenbroek.Ed 245*521fa314SDavid van Moolenbroek.Pp 246*521fa314SDavid van MoolenbroekNote how the 247*521fa314SDavid van Moolenbroek.Dq Li SIG 248*521fa314SDavid van Moolenbroekprefixes are omitted for brevity in this case. 249*521fa314SDavid van Moolenbroek.Pp 250*521fa314SDavid van MoolenbroekWhen multiple processes are traced at once, each line will have a prefix that 251*521fa314SDavid van Moolenbroekshows the PID of the corresponding process. 252*521fa314SDavid van MoolenbroekWhen the number of processes drops to one again, one more line is prefixed with 253*521fa314SDavid van Moolenbroekthe PID of the remaining process, but using a 254*521fa314SDavid van Moolenbroek.Sq Li ' 255*521fa314SDavid van Moolenbroekinstead of a 256*521fa314SDavid van Moolenbroek.Sq Li | 257*521fa314SDavid van Moolenbroeksymbol: 258*521fa314SDavid van Moolenbroek.Bd -literal -offset indent 259*521fa314SDavid van Moolenbroekfork() = 25813 260*521fa314SDavid van Moolenbroek25813| Tracing test*F (pid 25813) 261*521fa314SDavid van Moolenbroek25813| fork() = 0 262*521fa314SDavid van Moolenbroek25812| waitpid(-1, &.., WNOHANG) = 0 263*521fa314SDavid van Moolenbroek25813| exit(1) 264*521fa314SDavid van Moolenbroek25813| Process exited normally with code 1 265*521fa314SDavid van Moolenbroek25812' waitpid(-1, W_EXITED(1), WNOHANG) = 25813 266*521fa314SDavid van Moolenbroekexit(0) 267*521fa314SDavid van MoolenbroekProcess exited normally with code 0 268*521fa314SDavid van Moolenbroek.Ed 269*521fa314SDavid van Moolenbroek.Pp 270*521fa314SDavid van MoolenbroekIf a process is preempted while making a system call, the system call will 271*521fa314SDavid van Moolenbroekbe shown as suspended with the 272*521fa314SDavid van Moolenbroek.Dq Li <..> 273*521fa314SDavid van Moolenbroeksuffix. 274*521fa314SDavid van MoolenbroekLater, when the system call is resumed, the output so far will be repeated, 275*521fa314SDavid van Moolenbroekeither in full or (due to memory limitations) with 276*521fa314SDavid van Moolenbroek.Dq Li <..> 277*521fa314SDavid van Moolenbroekin its body, before the remaining part of the system call is printed. 278*521fa314SDavid van MoolenbroekThis time, the line will have a 279*521fa314SDavid van Moolenbroek.Sq Li * 280*521fa314SDavid van Moolenbroekasterisk in its prefix, to indicate that this is not a new system call: 281*521fa314SDavid van Moolenbroek.Bd -literal -offset indent 282*521fa314SDavid van Moolenbroek25812| write(1, "test\en", 5) = <..> 283*521fa314SDavid van Moolenbroek25813| setuid(0) = 0 284*521fa314SDavid van Moolenbroek25812|*write(1, "test\en", 5) = 5 285*521fa314SDavid van Moolenbroek.Ed 286*521fa314SDavid van Moolenbroek.Pp 287*521fa314SDavid van MoolenbroekFinally, 288*521fa314SDavid van Moolenbroek.Nm 289*521fa314SDavid van Moolenbroekprints three dashes on their own line whenever the process context (program 290*521fa314SDavid van Moolenbroekcounter and/or stack pointer) is changed during a system call. 291*521fa314SDavid van MoolenbroekThis feature intends to help identify blocks of code run from signal handlers. 292*521fa314SDavid van MoolenbroekThe following example shows a SIGALRM signal handler being invoked. 293*521fa314SDavid van Moolenbroek.Bd -literal -offset indent 294*521fa314SDavid van Moolenbroeksigsuspend([]) = ** SIGALRM ** -1 [EINTR] 295*521fa314SDavid van Moolenbroek--- 296*521fa314SDavid van Moolenbroeksigprocmask(SIG_SETMASK, ~[], [ALRM]) = 0 297*521fa314SDavid van Moolenbroeksigreturn({sc_mask=[], ..}) 298*521fa314SDavid van Moolenbroek--- 299*521fa314SDavid van Moolenbroekexit(0) 300*521fa314SDavid van Moolenbroek.Ed 301*521fa314SDavid van Moolenbroek.Pp 302*521fa314SDavid van MoolenbroekHowever, the three dashes are not printed when a signal handler is invoked 303*521fa314SDavid van Moolenbroekwhile the program is not in a system call, because the tracer does not see such 304*521fa314SDavid van Moolenbroekinvocations. 305*521fa314SDavid van MoolenbroekIt is however also printed for successful 306*521fa314SDavid van Moolenbroek.Fn execve 307*521fa314SDavid van Moolenbroekcalls. 308*521fa314SDavid van Moolenbroek.Sh DIAGNOSTICS 309*521fa314SDavid van Moolenbroek.Ex 310*521fa314SDavid van Moolenbroek.Sh SEE ALSO 311*521fa314SDavid van Moolenbroek.Xr ptrace 2 312*521fa314SDavid van Moolenbroek.Sh AUTHORS 313*521fa314SDavid van MoolenbroekThe 314*521fa314SDavid van Moolenbroek.Nm 315*521fa314SDavid van Moolenbroekutility was written by 316*521fa314SDavid van Moolenbroek.An David van Moolenbroek 317*521fa314SDavid van Moolenbroek.Aq david@minix3.org . 318*521fa314SDavid van Moolenbroek.Sh BUGS 319*521fa314SDavid van MoolenbroekWhile the utility aims to provide output for all system calls that can possibly 320*521fa314SDavid van Moolenbroekbe made by user programs, output printers for a small number of rarely-used 321*521fa314SDavid van Moolenbroekstructures and IOCTLs are still missing. In such cases, plain pointers will be 322*521fa314SDavid van Moolenbroekprinted instead of actual contents. 323*521fa314SDavid van Moolenbroek.Pp 324*521fa314SDavid van MoolenbroekA signal arrives at the tracing process when sent to the target process, even 325*521fa314SDavid van Moolenbroekwhen the target process is blocking the signal and will thus receive it later. 326*521fa314SDavid van MoolenbroekThis is a limitation of the ptrace infrastructure, although it does ensure that 327*521fa314SDavid van Moolenbroeka target process is not able to block signals generated for tracing purposes. 328*521fa314SDavid van MoolenbroekThe result is that signals are not always shown at the time that they are 329*521fa314SDavid van Moolenbroektaken in by the target process, and that stack traces for signals may be off. 330*521fa314SDavid van Moolenbroek.Pp 331*521fa314SDavid van MoolenbroekAttaching to system services is currently not supported, due to limitations of 332*521fa314SDavid van Moolenbroekthe ptrace infrastructure. The 333*521fa314SDavid van Moolenbroek.Nm 334*521fa314SDavid van Moolenbroekutility will detect and safely detach from system services, though. 335