Remove building with NOCRYPTO option
[minix.git] / minix / usr.bin / trace / trace.1
blob905d4dafb27bea0f33a0ba2a76da28eb7c71bd19
1 .Dd November 2, 2014
2 .Dt TRACE 1
3 .Os
4 .Sh NAME
5 .Nm trace
6 .Nd print process system calls and signals
7 .Sh SYNOPSIS
8 .Nm
9 .Op Fl fgNstVv
10 .Op Fl o Ar file
11 .Op Fl p Ar pid
12 .Op Ar command
13 .Sh DESCRIPTION
14 The
15 .Nm
16 utility shows one or more processes to be traced.
17 For each traced process,
18 .Nm
19 prints the system calls the process makes and the signals
20 it receives.
21 The user can let
22 .Nm
23 start a
24 .Ar command
25 to be traced, and/or attach to one or more existing processes.
26 .Pp
27 The utility will run until no processes are left to trace, or until the user
28 presses the interrupt key (typically Ctrl-C).
29 Pressing this key once will cause all attached processes to be detached, with
30 the hope that the command that was started will also terminate cleanly from the
31 interruption.
32 Pressing the interrupt key once more kills the command that was started.
33 .Pp
34 The following options are available:
35 .Bl -tag -width XoXfileXX
36 .It Fl f
37 Follow forks.
38 Attach automatically to forked child processes.
39 Child processes of the started command will be treated as attached processes,
40 in that upon Ctrl-C presses they will be detached rather than killed.
41 .It Fl g
42 Enable call grouping.
43 With this option, the tracing engine tries to reduce noise from call preemption
44 by first polling the process that was active last.
45 This should reduce in cleaner output, but may also cause a single process to be
46 scheduled repeatedly and thus cause starvation.
47 .It Fl N
48 Print all names.
49 By default, the most structure fields are printed with their name.
50 This option enables printing of all available names, which also includes
51 system call parameter names.
52 This flag may be useful to figure out the meaning of a parameter, and for
53 automatic processing of the output.
54 .It Fl s
55 Print stack traces.
56 Each system call, and each signal arriving outside a system call, will be
57 preceded by a line showing the process's current stack trace.
58 For signals blocked by the target process, the stack trace may not be
59 meaningful.
60 Stack traces may not be supported on all platforms.
61 .It Fl t
62 Print timestamps.
63 By default, no timestamps are printed.
64 If this flag is given once, each line will be prefixed by the current time.
65 If this flag is given twice, the time will also include microseconds.
66 The printed timestamp corresponds to the time at which printing of the rest of
67 the line was initiated, which in the case of call resumption may not be the
68 same as the time that the system call was initiated.
69 .It Fl V
70 Print values only.
71 If this flag is given once, numerical values will be printed instead of
72 string constants.
73 In addition, if it is given twice, the addresses of structures will be printed
74 instead of their contents.
75 .It Fl v
76 Increase verbosity.
77 By default, the output will be terse, in that not all structure fields are
78 shown, and strings and arrays are not always printed in full.
79 If this flag is provided once, more and longer output will be printed.
80 If it is provided twice, the tracer will print as much as possible.
81 .It Fl o Ar file
82 Redirect output.
83 By default, the output is sent to standard error.
84 With this option, the output is written to the given
85 .Ar file
86 instead.
87 .It Fl p Ar pid
88 Attach to a process.
89 This option makes
90 .Nm
91 attach to an existing process with process ID
92 .Ar pid .
93 This option may be used multiple times.
94 When attaching to one or more processes this way, starting a command becomes
95 optional.
96 .El
97 .Pp
98 If the user presses the information key (typically Ctrl-T), the list of traced
99 process along with their current status will be printed.
100 .Sh OUTPUT FORMAT
101 System calls are printed with the following general output format:
102 .Bd -literal -offset indent
103 .Sy name Ns ( Ns Sy parameters Ns ) = Sy result
106 Other informational lines may be printed about the status of the process.
107 These lines typically start with an uppercase letter, while system calls
108 always start with a lowercase letter or an underscore.
109 The following example shows the tracer output for a program that prints its
110 own user ID:
111 .Bd -literal -offset indent
112 Tracing printuid (pid 12685)
113 minix_getinfo() = 0
114 getuid() = 0 (euid=1)
115 write(1, "My uid: 0\en", 10) = 10
116 exit(0)
117 Process exited normally with code 0
120 The first and last lines of the output provide status information about the
121 traced process.
122 Some calls return multiple results; extended results are printed in parentheses
123 after the primary call result, typically in
124 .Va name Ns = Ns Va value
125 format for clarity.
126 System calls that do not return on success, such as
127 .Fn exit ,
128 are printed without the equals sign and result, unless they fail.
129 System call failure is printed according to POSIX conventions; that is, the
130 call is assumed to return -1 with the value of
131 .Va errno
132 printed in square brackets after it:
133 .Bd -literal -offset indent
134 setuid(0) = -1 [EPERM]
137 If a system call ends up in an IPC-level failure, the -1 value will be preceded
138 by an
139 .Dq Li <ipc>
140 string.
141 However, this string will be omitted if the system call itself is printed at
142 the IPC level (that is, as an
143 .Fn ipc_sendrec
144 call), generally because
146 has no handler to print the actual system call.
148 Signals are printed as they arrive at the traced process, using two asterisks
149 on both side of the signal name.
150 Signals may arrive both during and outside the execution of a system call:
151 .Bd -literal -offset indent
152 read(3, ** SIGUSR1 ** &0xeffff867, 4096) = -1 [EINTR]
153 ** SIGUSR2 **
154 getpid() = 5278 (ppid=5277)
155 kill(5278, SIGTERM) = ** SIGTERM ** <..>
156 Process terminated from signal SIGTERM
159 Multiple signals may be printed consecutively.
160 The above example illustrates a few other important aspects of output
161 formatting.
162 Some call parameters may be printed only after the system call returns, in
163 order to show their actual value.
164 For the
165 .Fn read
166 call, this would be the bytes that were read.
167 Upon failure, no bytes were read, so the buffer pointer is printed instead.
168 Finally, if a call that is expected to return (here,
169 .Fn kill )
170 does not return before the process terminates, the line ends with a
171 .Dq Li <..>
172 marker.
173 This is an instance of call preemption; more about that later.
175 Pointers are printed with a
176 .Sq Li &
177 prefix, except for NULL, which is printed using its own name.
178 In general, named constants are used instead of numerical constants wherever
179 that makes sense.
180 For pointers of which the address is not available, typically because its
181 contents are passed by value,
182 .Dq Li &..
183 is shown instead.
185 Data buffers are printed as double-quoted strings, using C-style character
186 escaping for nontextual bytes.
187 If either the verbosity level or a copy error prevents the whole data buffer
188 from being printed, two dots will be printed after the closing quote.
189 The same is done when printing a string buffer which does not have a null
190 termination byte within its range.
191 Path names are shown in full regardless of the verbosity level.
193 Structures are printed as a set of structure fields enclosed in curly brackets.
195 .Va name Ns = Ns Va value
196 format is used, unless printing names for that structure type would introduce
197 too much noise and the
198 .Dq print all names
199 option is not given.
200 For many structures, by default only a subset of their fields are printed.
201 In this case, a
202 .Dq Li ..
203 entry is added at the end.
204 In some cases, an attempt is made to print only the most useful fields:
205 .Bd -literal -offset indent
206 stat("/etc/motd", {st_mode=S_IFREG|0755, st_size=747, ..}) = 0
207 stat("/dev/tty", {st_mode=S_IFCHR|0666, st_rdev=<5,0>, ..}) = 0
210 As shown in the above example, flag fields are printed as a combination of
211 named constants, separated by a
212 .Sq Li |
213 pipe symbol.
214 Any leftover numerical bits are printed at the end.
215 The example also shows the format in which major/minor pairs are printed for
216 device numbers.
217 This is a custom format; there are a few other custom formats throughout the
219 output which are supposed to be sufficiently self-explanatory (and rare).
221 Arrays are printed using square brackets.
222 .Bd -literal -offset indent
223 pipe2([3, 4], 0) = 0
224 getdents(3, [..(45)], 4096) = 1824
225 getdents(3, [{d_name="."}, ..(+44)], 4096) = 1824
226 getdents(3, [], 4096) = 0
229 If the array contents are not printed as per the settings for the verbosity
230 level, a single pseudo-element shows how many actual elements were in the array
231 (the second line in the example).
232 If the number of printed elements is limited, a final pseudo-element shows how
233 many additional elements were not printed (the third line in the example).
234 If a copy error occurs while part of the array has been printed already, a
235 last
236 .Dq Li ..(?)
237 pseudo-element is printed; for immediate failure, the array's pointer is shown.
238 Empty arrays will be printed as
239 .Dq Li [] .
241 Bit sets are printed as arrays except with just a space and no comma as
242 bit separator, closely following the output format of
243 .Nm Ns 's
244 original inspiration
245 .Sy strace .
246 For signal sets in particular, an inverted bit set may be shown, thus printing
247 only the bits which are not set; such sets are prefixed with a
248 .Sq Li ~
249 to the opening bracket:
250 .Bd -literal -offset indent
251 sigprocmask(SIG_SETMASK, ~[USR1 USR2], []) = 0
254 Note how the
255 .Dq Li SIG
256 prefixes are omitted for brevity in this case.
258 When multiple processes are traced at once, each line will have a prefix that
259 shows the PID of the corresponding process.
260 When the number of processes drops to one again, one more line is prefixed with
261 the PID of the remaining process, but using a
262 .Sq Li '
263 instead of a
264 .Sq Li |
265 symbol:
266 .Bd -literal -offset indent
267 fork() = 25813
268 25813| Tracing test*F (pid 25813)
269 25813| fork() = 0
270 25812| waitpid(-1, &.., WNOHANG) = 0
271 25813| exit(1)
272 25813| Process exited normally with code 1
273 25812' waitpid(-1, W_EXITED(1), WNOHANG) = 25813
274 exit(0)
275 Process exited normally with code 0
278 If a process is preempted while making a system call, the system call will
279 be shown as suspended with the
280 .Dq Li <..>
281 suffix.
282 Later, when the system call is resumed, the output so far will be repeated,
283 either in full or (due to memory limitations) with
284 .Dq Li <..>
285 in its body, before the remaining part of the system call is printed.
286 This time, the line will have a
287 .Sq Li *
288 asterisk in its prefix, to indicate that this is not a new system call:
289 .Bd -literal -offset indent
290 25812| write(1, "test\en", 5) = <..>
291 25813| setuid(0) = 0
292 25812|*write(1, "test\en", 5) = 5
295 Finally,
297 prints three dashes on their own line whenever the process context (program
298 counter and/or stack pointer) is changed during a system call.
299 This feature intends to help identify blocks of code run from signal handlers.
300 The following example shows a SIGALRM signal handler being invoked.
301 .Bd -literal -offset indent
302 sigsuspend([]) = ** SIGALRM ** -1 [EINTR]
304 sigprocmask(SIG_SETMASK, ~[], [ALRM]) = 0
305 sigreturn({sc_mask=[], ..})
307 exit(0)
310 However, the three dashes are not printed when a signal handler is invoked
311 while the program is not in a system call, because the tracer does not see such
312 invocations.
313 It is however also printed for successful
314 .Fn execve
315 calls.
316 .Sh DIAGNOSTICS
318 .Sh SEE ALSO
319 .Xr ptrace 2
320 .Sh AUTHORS
323 utility was written by
324 .An David van Moolenbroek
325 .Aq david@minix3.org .
326 .Sh BUGS
327 While the utility aims to provide output for all system calls that can possibly
328 be made by user programs, output printers for a small number of rarely-used
329 structures and IOCTLs are still missing.  In such cases, plain pointers will be
330 printed instead of actual contents.
332 A signal arrives at the tracing process when sent to the target process, even
333 when the target process is blocking the signal and will thus receive it later.
334 This is a limitation of the ptrace infrastructure, although it does ensure that
335 a target process is not able to block signals generated for tracing purposes.
336 The result is that signals are not always shown at the time that they are
337 taken in by the target process, and that stack traces for signals may be off.
339 Attaching to system services is currently not supported, due to limitations of
340 the ptrace infrastructure.  The
342 utility will detect and safely detach from system services, though.