|  | .\" Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl> | 
|  | .\" Copyright (c) 1993 Branko Lankester <branko@hacktic.nl> | 
|  | .\" Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com> | 
|  | .\" Copyright (c) 1996-2017 The strace developers. | 
|  | .\" All rights reserved. | 
|  | .\" | 
|  | .\" Redistribution and use in source and binary forms, with or without | 
|  | .\" modification, are permitted provided that the following conditions | 
|  | .\" are met: | 
|  | .\" 1. Redistributions of source code must retain the above copyright | 
|  | .\"    notice, this list of conditions and the following disclaimer. | 
|  | .\" 2. Redistributions in binary form must reproduce the above copyright | 
|  | .\"    notice, this list of conditions and the following disclaimer in the | 
|  | .\"    documentation and/or other materials provided with the distribution. | 
|  | .\" 3. The name of the author may not be used to endorse or promote products | 
|  | .\"    derived from this software without specific prior written permission. | 
|  | .\" | 
|  | .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | 
|  | .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | 
|  | .\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | 
|  | .\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | 
|  | .\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | 
|  | .\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
|  | .\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
|  | .\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
|  | .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 
|  | .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  | .de CW | 
|  | .sp | 
|  | .in +4n | 
|  | .nf | 
|  | .ft CW | 
|  | .. | 
|  | .de CE | 
|  | .ft R | 
|  | .fi | 
|  | .in | 
|  | .sp | 
|  | .. | 
|  | .\" Like .OP, but with ellipsis at the end in order to signify that option | 
|  | .\" can be provided multiple times. Based on .OP definition in groff's | 
|  | .\" an-ext.tmac. | 
|  | .de OM | 
|  | .  ie \\n(.$-1 \ | 
|  | .    RI "[\fB\\$1\fP" "\ \\$2" "]...\&" | 
|  | .  el \ | 
|  | .    RB "[" "\\$1" "]...\&" | 
|  | .. | 
|  | .\" Required option. | 
|  | .de OR | 
|  | .  ie \\n(.$-1 \ | 
|  | .    RI "\fB\\$1\fP" "\ \\$2" | 
|  | .  el \ | 
|  | .    BR "\\$1" | 
|  | .. | 
|  | .TH STRACE 1 "2018-07-07" "strace 4.25" | 
|  | .SH NAME | 
|  | strace \- trace system calls and signals | 
|  | .SH SYNOPSIS | 
|  | .SY strace | 
|  | .if ''#' .ig end_unwind_opt | 
|  | .OP \-ACdffhikqrtttTvVxxy | 
|  | .end_unwind_opt | 
|  | .if '#'#' .ig end_no_unwind_opt | 
|  | .OP \-ACdffhiqrtttTvVxxy | 
|  | .end_no_unwind_opt | 
|  | .OP \-I n | 
|  | .OP \-b execve | 
|  | .OM \-e expr | 
|  | .OP \-a column | 
|  | .OP \-o file | 
|  | .OP \-s strsize | 
|  | .OP \-X format | 
|  | .OM \-P path | 
|  | .OM \-p pid | 
|  | .BR "" { | 
|  | .OR \-p pid | 
|  | .BR "" | | 
|  | .OP \-D | 
|  | .OM \-E var\fR[=\fIval\fR] | 
|  | .OP \-u username | 
|  | .IR command " [" args ] | 
|  | .BR "" } | 
|  | .YS | 
|  | .SY strace | 
|  | .B \-c | 
|  | .OP \-df | 
|  | .OP \-I n | 
|  | .OP \-b execve | 
|  | .OM \-e expr | 
|  | .OP \-O overhead | 
|  | .OP \-S sortby | 
|  | .OM \-P path | 
|  | .OM \-p pid | 
|  | .BR "" { | 
|  | .OR \-p pid | 
|  | .BR "" | | 
|  | .OP \-D | 
|  | .OM \-E var\fR[=\fIval\fR] | 
|  | .OP -u username | 
|  | .IR command " [" args ] | 
|  | .BR "" } | 
|  | .YS | 
|  |  | 
|  | .SH DESCRIPTION | 
|  | .IX "strace command" "" "\fLstrace\fR command" | 
|  | .LP | 
|  | In the simplest case | 
|  | .B strace | 
|  | runs the specified | 
|  | .I command | 
|  | until it exits. | 
|  | It intercepts and records the system calls which are called | 
|  | by a process and the signals which are received by a process. | 
|  | The name of each system call, its arguments and its return value | 
|  | are printed on standard error or to the file specified with the | 
|  | .B \-o | 
|  | option. | 
|  | .LP | 
|  | .B strace | 
|  | is a useful diagnostic, instructional, and debugging tool. | 
|  | System administrators, diagnosticians and trouble-shooters will find | 
|  | it invaluable for solving problems with | 
|  | programs for which the source is not readily available since | 
|  | they do not need to be recompiled in order to trace them. | 
|  | Students, hackers and the overly-curious will find that | 
|  | a great deal can be learned about a system and its system calls by | 
|  | tracing even ordinary programs.  And programmers will find that | 
|  | since system calls and signals are events that happen at the user/kernel | 
|  | interface, a close examination of this boundary is very | 
|  | useful for bug isolation, sanity checking and | 
|  | attempting to capture race conditions. | 
|  | .LP | 
|  | Each line in the trace contains the system call name, followed | 
|  | by its arguments in parentheses and its return value. | 
|  | An example from stracing the command "cat /dev/null" is: | 
|  | .CW | 
|  | open("/dev/null", O_RDONLY) = 3 | 
|  | .CE | 
|  | Errors (typically a return value of \-1) have the errno symbol | 
|  | and error string appended. | 
|  | .CW | 
|  | open("/foo/bar", O_RDONLY) = \-1 ENOENT (No such file or directory) | 
|  | .CE | 
|  | Signals are printed as signal symbol and decoded siginfo structure. | 
|  | An excerpt from stracing and interrupting the command "sleep 666" is: | 
|  | .CW | 
|  | sigsuspend([] <unfinished ...> | 
|  | --- SIGINT {si_signo=SIGINT, si_code=SI_USER, si_pid=...} --- | 
|  | +++ killed by SIGINT +++ | 
|  | .CE | 
|  | If a system call is being executed and meanwhile another one is being called | 
|  | from a different thread/process then | 
|  | .B strace | 
|  | will try to preserve the order of those events and mark the ongoing call as | 
|  | being | 
|  | .IR unfinished . | 
|  | When the call returns it will be marked as | 
|  | .IR resumed . | 
|  | .CW | 
|  | [pid 28772] select(4, [3], NULL, NULL, NULL <unfinished ...> | 
|  | [pid 28779] clock_gettime(CLOCK_REALTIME, {1130322148, 939977000}) = 0 | 
|  | [pid 28772] <... select resumed> )      = 1 (in [3]) | 
|  | .CE | 
|  | Interruption of a (restartable) system call by a signal delivery is processed | 
|  | differently as kernel terminates the system call and also arranges its | 
|  | immediate reexecution after the signal handler completes. | 
|  | .CW | 
|  | read(0, 0x7ffff72cf5cf, 1)              = ? ERESTARTSYS (To be restarted) | 
|  | --- SIGALRM ... --- | 
|  | rt_sigreturn(0xe)                       = 0 | 
|  | read(0, "", 1)                          = 0 | 
|  | .CE | 
|  | Arguments are printed in symbolic form with passion. | 
|  | This example shows the shell performing ">>xyzzy" output redirection: | 
|  | .CW | 
|  | open("xyzzy", O_WRONLY|O_APPEND|O_CREAT, 0666) = 3 | 
|  | .CE | 
|  | Here, the third argument of | 
|  | .B open | 
|  | is decoded by breaking down the | 
|  | flag argument into its three bitwise-OR constituents and printing the | 
|  | mode value in octal by tradition.  Where the traditional or native | 
|  | usage differs from ANSI or POSIX, the latter forms are preferred. | 
|  | In some cases, | 
|  | .B strace | 
|  | output is proven to be more readable than the source. | 
|  | .LP | 
|  | Structure pointers are dereferenced and the members are displayed | 
|  | as appropriate.  In most cases, arguments are formatted in the most C-like | 
|  | fashion possible. | 
|  | For example, the essence of the command "ls \-l /dev/null" is captured as: | 
|  | .CW | 
|  | lstat("/dev/null", {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0 | 
|  | .CE | 
|  | Notice how the 'struct stat' argument is dereferenced and how each member is | 
|  | displayed symbolically.  In particular, observe how the | 
|  | .B st_mode | 
|  | member is carefully decoded into a bitwise-OR of symbolic and numeric values. | 
|  | Also notice in this example that the first argument to | 
|  | .B lstat | 
|  | is an input to the system call and the second argument is an output. | 
|  | Since output arguments are not modified if the system call fails, arguments may | 
|  | not always be dereferenced.  For example, retrying the "ls \-l" example | 
|  | with a non-existent file produces the following line: | 
|  | .CW | 
|  | lstat("/foo/bar", 0xb004) = \-1 ENOENT (No such file or directory) | 
|  | .CE | 
|  | In this case the porch light is on but nobody is home. | 
|  | .LP | 
|  | Syscalls unknown to | 
|  | .B strace | 
|  | are printed raw, with the unknown system call number printed in hexadecimal form | 
|  | and prefixed with "syscall_": | 
|  | .CW | 
|  | syscall_0xbad(0x1, 0x2, 0x3, 0x4, 0x5, 0x6) = -1 ENOSYS (Function not implemented) | 
|  | .CE | 
|  | .LP | 
|  | Character pointers are dereferenced and printed as C strings. | 
|  | Non-printing characters in strings are normally represented by | 
|  | ordinary C escape codes. | 
|  | Only the first | 
|  | .I strsize | 
|  | (32 by default) bytes of strings are printed; | 
|  | longer strings have an ellipsis appended following the closing quote. | 
|  | Here is a line from "ls \-l" where the | 
|  | .B getpwuid | 
|  | library routine is reading the password file: | 
|  | .CW | 
|  | read(3, "root::0:0:System Administrator:/"..., 1024) = 422 | 
|  | .CE | 
|  | While structures are annotated using curly braces, simple pointers | 
|  | and arrays are printed using square brackets with commas separating | 
|  | elements.  Here is an example from the command "id" on a system with | 
|  | supplementary group ids: | 
|  | .CW | 
|  | getgroups(32, [100, 0]) = 2 | 
|  | .CE | 
|  | On the other hand, bit-sets are also shown using square brackets | 
|  | but set elements are separated only by a space.  Here is the shell, | 
|  | preparing to execute an external command: | 
|  | .CW | 
|  | sigprocmask(SIG_BLOCK, [CHLD TTOU], []) = 0 | 
|  | .CE | 
|  | Here, the second argument is a bit-set of two signals, | 
|  | .BR SIGCHLD " and " SIGTTOU . | 
|  | In some cases, the bit-set is so full that printing out the unset | 
|  | elements is more valuable.  In that case, the bit-set is prefixed by | 
|  | a tilde like this: | 
|  | .CW | 
|  | sigprocmask(SIG_UNBLOCK, ~[], NULL) = 0 | 
|  | .CE | 
|  | Here, the second argument represents the full set of all signals. | 
|  | .SH OPTIONS | 
|  | .SS Output format | 
|  | .TP 12 | 
|  | .BI "\-a " column | 
|  | Align return values in a specific column (default column 40). | 
|  | .TP | 
|  | .B \-i | 
|  | Print the instruction pointer at the time of the system call. | 
|  | .if ''#' .ig end_unwind | 
|  | .TP | 
|  | .B \-k | 
|  | Print the execution stack trace of the traced processes after each system call. | 
|  | .end_unwind | 
|  | .TP | 
|  | .BI "\-o " filename | 
|  | Write the trace output to the file | 
|  | .I filename | 
|  | rather than to stderr. | 
|  | .IR filename . pid | 
|  | form is used if | 
|  | .B \-ff | 
|  | option is supplied. | 
|  | If the argument begins with '|' or '!', the rest of the | 
|  | argument is treated as a command and all output is piped to it. | 
|  | This is convenient for piping the debugging output to a program | 
|  | without affecting the redirections of executed programs. | 
|  | The latter is not compatible with | 
|  | .B \-ff | 
|  | option currently. | 
|  | .TP | 
|  | .B \-A | 
|  | Open the file provided in the | 
|  | .B \-o | 
|  | option in append mode. | 
|  | .TP | 
|  | .B \-q | 
|  | Suppress messages about attaching, detaching etc.  This happens | 
|  | automatically when output is redirected to a file and the command | 
|  | is run directly instead of attaching. | 
|  | .TP | 
|  | .B \-qq | 
|  | If given twice, suppress messages about process exit status. | 
|  | .TP | 
|  | .B \-r | 
|  | Print a relative timestamp upon entry to each system call.  This | 
|  | records the time difference between the beginning of successive | 
|  | system calls. | 
|  | Note that since | 
|  | .B \-r | 
|  | option uses the monotonic clock time for measuring time difference and not the | 
|  | wall clock time, its measurements can differ from the difference in time | 
|  | reported by the | 
|  | .B \-t | 
|  | option. | 
|  | .TP | 
|  | .BI "\-s " strsize | 
|  | Specify the maximum string size to print (the default is 32).  Note | 
|  | that filenames are not considered strings and are always printed in | 
|  | full. | 
|  | .TP | 
|  | .B \-t | 
|  | Prefix each line of the trace with the wall clock time. | 
|  | .TP | 
|  | .B \-tt | 
|  | If given twice, the time printed will include the microseconds. | 
|  | .TP | 
|  | .B \-ttt | 
|  | If given thrice, the time printed will include the microseconds | 
|  | and the leading portion will be printed as the number | 
|  | of seconds since the epoch. | 
|  | .TP | 
|  | .B \-T | 
|  | Show the time spent in system calls.  This records the time | 
|  | difference between the beginning and the end of each system call. | 
|  | .TP | 
|  | .B \-x | 
|  | Print all non-ASCII strings in hexadecimal string format. | 
|  | .TP | 
|  | .B \-xx | 
|  | Print all strings in hexadecimal string format. | 
|  | .TP | 
|  | .BI "\-X " format | 
|  | Set the format for printing of named constants and flags. | 
|  | Supported | 
|  | .I format | 
|  | values are: | 
|  | .RS | 
|  | .TP 10 | 
|  | .B raw | 
|  | Raw number output, without decoding. | 
|  | .TP | 
|  | .B abbrev | 
|  | Output a named constant or a set of flags instead of the raw number if they are | 
|  | found. | 
|  | This is the default | 
|  | .B strace | 
|  | behaviour. | 
|  | .TP | 
|  | .B verbose | 
|  | Output both the raw value and the decoded string (as a comment). | 
|  | .RE | 
|  | .TP | 
|  | .B \-y | 
|  | Print paths associated with file descriptor arguments. | 
|  | .TP | 
|  | .B \-yy | 
|  | Print protocol specific information associated with socket file descriptors, | 
|  | and block/character device number associated with device file descriptors. | 
|  | .SS Statistics | 
|  | .TP 12 | 
|  | .B \-c | 
|  | Count time, calls, and errors for each system call and report a summary on | 
|  | program exit, suppressing the regular output. | 
|  | This attempts to show system time (CPU time spent running | 
|  | in the kernel) independent of wall clock time.  If | 
|  | .B \-c | 
|  | is used with | 
|  | .BR \-f , | 
|  | only aggregate totals for all traced processes are kept. | 
|  | .TP | 
|  | .B \-C | 
|  | Like | 
|  | .B \-c | 
|  | but also print regular output while processes are running. | 
|  | .TP | 
|  | .BI "\-O " overhead | 
|  | Set the overhead for tracing system calls to | 
|  | .I overhead | 
|  | microseconds. | 
|  | This is useful for overriding the default heuristic for guessing | 
|  | how much time is spent in mere measuring when timing system calls using | 
|  | the | 
|  | .B \-c | 
|  | option.  The accuracy of the heuristic can be gauged by timing a given | 
|  | program run without tracing (using | 
|  | .BR time (1)) | 
|  | and comparing the accumulated | 
|  | system call time to the total produced using | 
|  | .BR \-c . | 
|  | .TP | 
|  | .BI "\-S " sortby | 
|  | Sort the output of the histogram printed by the | 
|  | .B \-c | 
|  | option by the specified criterion.  Legal values are | 
|  | .BR time , | 
|  | .BR calls , | 
|  | .BR name , | 
|  | and | 
|  | .B nothing | 
|  | (default is | 
|  | .BR time ). | 
|  | .TP | 
|  | .B \-w | 
|  | Summarise the time difference between the beginning and end of | 
|  | each system call.  The default is to summarise the system time. | 
|  | .SS Filtering | 
|  | .TP 12 | 
|  | .BI "\-e " expr | 
|  | A qualifying expression which modifies which events to trace | 
|  | or how to trace them.  The format of the expression is: | 
|  | .RS 15 | 
|  | .IP | 
|  | [\,\fIqualifier\/\fB=\fR][\fB!\fR][\fB?\fR]\,\fIvalue1\/\fR[\fB,\fR[\fB?\fR]\,\fIvalue2\/\fR]... | 
|  | .RE | 
|  | .IP | 
|  | where | 
|  | .I qualifier | 
|  | is one of | 
|  | .BR trace , | 
|  | .BR abbrev , | 
|  | .BR verbose , | 
|  | .BR raw , | 
|  | .BR signal , | 
|  | .BR read , | 
|  | .BR write , | 
|  | .BR fault , | 
|  | .BR inject , | 
|  | or | 
|  | .B kvm | 
|  | and | 
|  | .I value | 
|  | is a qualifier-dependent symbol or number.  The default | 
|  | qualifier is | 
|  | .BR trace . | 
|  | Using an exclamation mark negates the set of values.  For example, | 
|  | .BR \-e "\ " open | 
|  | means literally | 
|  | .BR \-e "\ " trace = open | 
|  | which in turn means trace only the | 
|  | .B open | 
|  | system call.  By contrast, | 
|  | .BR \-e "\ " trace "=!" open | 
|  | means to trace every system call except | 
|  | .BR open . | 
|  | Question mark before the syscall qualification allows suppression of error | 
|  | in case no syscalls matched the qualification provided. | 
|  | Appending one of "@64", "@32", or "@x32" suffixes to the syscall qualification | 
|  | allows specifying syscalls only for the 64-bit, 32-bit, or 32-on-64-bit | 
|  | personality, respectively. | 
|  | In addition, the special values | 
|  | .B all | 
|  | and | 
|  | .B none | 
|  | have the obvious meanings. | 
|  | .IP | 
|  | Note that some shells use the exclamation point for history | 
|  | expansion even inside quoted arguments.  If so, you must escape | 
|  | the exclamation point with a backslash. | 
|  | .TP | 
|  | \fB\-e\ trace\fR=\,\fIset\fR | 
|  | Trace only the specified set of system calls.  The | 
|  | .B \-c | 
|  | option is useful for determining which system calls might be useful | 
|  | to trace.  For example, | 
|  | .BR trace = open,close,read,write | 
|  | means to only | 
|  | trace those four system calls.  Be careful when making inferences | 
|  | about the user/kernel boundary if only a subset of system calls | 
|  | are being monitored.  The default is | 
|  | .BR trace = all . | 
|  | .TP | 
|  | \fB\-e\ trace\fR=/\,\fIregex\fR | 
|  | Trace only those system calls that match the | 
|  | .IR regex . | 
|  | You can use | 
|  | .B POSIX | 
|  | Extended Regular Expression syntax (see | 
|  | .BR regex (7)). | 
|  | .TP | 
|  | .BR "\-e\ trace" = %file | 
|  | .TQ | 
|  | .BR "\-e\ trace" = file " (deprecated)" | 
|  | Trace all system calls which take a file name as an argument.  You | 
|  | can think of this as an abbreviation for | 
|  | .BR "\-e\ trace" = open , stat , chmod , unlink ,... | 
|  | which is useful to seeing what files the process is referencing. | 
|  | Furthermore, using the abbreviation will ensure that you don't | 
|  | accidentally forget to include a call like | 
|  | .B lstat | 
|  | in the list.  Betchya woulda forgot that one. | 
|  | .TP | 
|  | .BR "\-e\ trace" = %process | 
|  | .TQ | 
|  | .BR "\-e\ trace" = process " (deprecated)" | 
|  | Trace all system calls which involve process management.  This | 
|  | is useful for watching the fork, wait, and exec steps of a process. | 
|  | .TP | 
|  | .BR "\-e\ trace" = %network | 
|  | .TQ | 
|  | .BR "\-e\ trace" = network " (deprecated)" | 
|  | Trace all the network related system calls. | 
|  | .TP | 
|  | .BR "\-e\ trace" = %signal | 
|  | .TQ | 
|  | .BR "\-e\ trace" = signal " (deprecated)" | 
|  | Trace all signal related system calls. | 
|  | .TP | 
|  | .BR "\-e\ trace" = %ipc | 
|  | .TQ | 
|  | .BR "\-e\ trace" = ipc " (deprecated)" | 
|  | Trace all IPC related system calls. | 
|  | .TP | 
|  | .BR "\-e\ trace" = %desc | 
|  | .TQ | 
|  | .BR "\-e\ trace" = desc " (deprecated)" | 
|  | Trace all file descriptor related system calls. | 
|  | .TP | 
|  | .BR "\-e\ trace" = %memory | 
|  | .TQ | 
|  | .BR "\-e\ trace" = memory " (deprecated)" | 
|  | Trace all memory mapping related system calls. | 
|  | .TP | 
|  | .BR "\-e\ trace" = %stat | 
|  | Trace stat syscall variants. | 
|  | .TP | 
|  | .BR "\-e\ trace" = %lstat | 
|  | Trace lstat syscall variants. | 
|  | .TP | 
|  | .BR "\-e\ trace" = %fstat | 
|  | Trace fstat and fstatat syscall variants. | 
|  | .TP | 
|  | .BR "\-e\ trace" = %%stat | 
|  | Trace syscalls used for requesting file status (stat, lstat, fstat, fstatat, | 
|  | statx, and their variants). | 
|  | .TP | 
|  | .BR "\-e\ trace" = %statfs | 
|  | Trace statfs, statfs64, statvfs, osf_statfs, and osf_statfs64 system calls. | 
|  | The same effect can be achieved with | 
|  | .BR "\-e\ trace" = /^(.*_)?statv?fs | 
|  | regular expression. | 
|  | .TP | 
|  | .BR "\-e\ trace" = %fstatfs | 
|  | Trace fstatfs, fstatfs64, fstatvfs, osf_fstatfs, and osf_fstatfs64 system calls. | 
|  | The same effect can be achieved with | 
|  | .BR "\-e\ trace" = /fstatv?fs | 
|  | regular expression. | 
|  | .TP | 
|  | .BR "\-e\ trace" = %%statfs | 
|  | Trace syscalls related to file system statistics (statfs-like, fstatfs-like, | 
|  | and ustat).  The same effect can be achieved with | 
|  | .BR "\-e\ trace" = /statv?fs|fsstat|ustat | 
|  | regular expression. | 
|  | .TP | 
|  | .BR "\-e\ trace" = %pure | 
|  | Trace syscalls that always succeed and have no arguments. | 
|  | Currently, this list includes | 
|  | .BR arc_gettls "(2), " getdtablesize "(2), " getegid "(2), " getegid32 "(2)," | 
|  | .BR geteuid "(2), " geteuid32 "(2), " getgid "(2), " getgid32 "(2)," | 
|  | .BR getpagesize "(2), " getpgrp "(2), " getpid "(2), " getppid "(2)," | 
|  | .BR get_thread_area (2) | 
|  | (on architectures other than x86), | 
|  | .BR gettid "(2), " get_tls "(2), " getuid "(2), " getuid32 "(2)," | 
|  | .BR getxgid "(2), " getxpid "(2), " getxuid "(2), " kern_features "(2), and" | 
|  | .BR metag_get_tls "(2)" | 
|  | syscalls. | 
|  | .TP | 
|  | \fB\-e\ abbrev\fR=\,\fIset\fR | 
|  | Abbreviate the output from printing each member of large structures. | 
|  | The default is | 
|  | .BR abbrev = all . | 
|  | The | 
|  | .B \-v | 
|  | option has the effect of | 
|  | .BR abbrev = none . | 
|  | .TP | 
|  | \fB\-e\ verbose\fR=\,\fIset\fR | 
|  | Dereference structures for the specified set of system calls.  The | 
|  | default is | 
|  | .BR verbose = all . | 
|  | .TP | 
|  | \fB\-e\ raw\fR=\,\fIset\fR | 
|  | Print raw, undecoded arguments for the specified set of system calls. | 
|  | This option has the effect of causing all arguments to be printed | 
|  | in hexadecimal.  This is mostly useful if you don't trust the | 
|  | decoding or you need to know the actual numeric value of an | 
|  | argument. | 
|  | See also | 
|  | .B \-X raw | 
|  | option. | 
|  | .TP | 
|  | \fB\-e\ signal\fR=\,\fIset\fR | 
|  | Trace only the specified subset of signals.  The default is | 
|  | .BR signal = all . | 
|  | For example, | 
|  | .BR signal "=!" SIGIO | 
|  | (or | 
|  | .BR signal "=!" io ) | 
|  | causes | 
|  | .B SIGIO | 
|  | signals not to be traced. | 
|  | .TP | 
|  | \fB\-e\ read\fR=\,\fIset\fR | 
|  | Perform a full hexadecimal and ASCII dump of all the data read from | 
|  | file descriptors listed in the specified set.  For example, to see | 
|  | all input activity on file descriptors | 
|  | .I 3 | 
|  | and | 
|  | .I 5 | 
|  | use | 
|  | \fB\-e\ read\fR=\,\fI3\fR,\fI5\fR. | 
|  | Note that this is independent from the normal tracing of the | 
|  | .BR read (2) | 
|  | system call which is controlled by the option | 
|  | .BR -e "\ " trace = read . | 
|  | .TP | 
|  | \fB\-e\ write\fR=\,\fIset\fR | 
|  | Perform a full hexadecimal and ASCII dump of all the data written to | 
|  | file descriptors listed in the specified set.  For example, to see | 
|  | all output activity on file descriptors | 
|  | .I 3 | 
|  | and | 
|  | .I 5 | 
|  | use | 
|  | \fB\-e\ write\fR=\,\fI3\fR,\,\fI5\fR. | 
|  | Note that this is independent from the normal tracing of the | 
|  | .BR write (2) | 
|  | system call which is controlled by the option | 
|  | .BR -e "\ " trace = write . | 
|  | .TP | 
|  | \fB\-e\ inject\fR=\,\fIset\/\fR[:\fBerror\fR=\,\fIerrno\/\fR|:\fBretval\fR=\,\fIvalue\/\fR][:\fBsignal\fR=\,\fIsig\/\fR][:\fBsyscall\fR=\fIsyscall\fR][:\fBdelay_enter\fR=\,\fIusecs\/\fR][:\fBdelay_exit\fR=\,\fIusecs\/\fR][:\fBwhen\fR=\,\fIexpr\/\fR] | 
|  | Perform syscall tampering for the specified set of syscalls. | 
|  |  | 
|  | At least one of | 
|  | .BR error , | 
|  | .BR retval , | 
|  | .BR signal , | 
|  | .BR delay_enter , | 
|  | or | 
|  | .B delay_exit | 
|  | options has to be specified. | 
|  | .B error | 
|  | and | 
|  | .B retval | 
|  | are mutually exclusive. | 
|  |  | 
|  | If :\fBerror\fR=\,\fIerrno\/\fR option is specified, | 
|  | a fault is injected into a syscall invocation: | 
|  | the syscall number is replaced by -1 which corresponds to an invalid syscall | 
|  | (unless a syscall is specified with :\fBsyscall=\fR option), | 
|  | and the error code is specified using a symbolic | 
|  | .I errno | 
|  | value like | 
|  | .B ENOSYS | 
|  | or a numeric value within 1..4095 range. | 
|  |  | 
|  | If :\fBretval\fR=\,\fIvalue\/\fR option is specified, | 
|  | success injection is performed: the syscall number is replaced by -1, | 
|  | but a bogus success value is returned to the callee. | 
|  |  | 
|  | If :\fBsignal\fR=\,\fIsig\/\fR option is specified with either a symbolic value | 
|  | like | 
|  | .B SIGSEGV | 
|  | or a numeric value within 1..\fBSIGRTMAX\fR range, | 
|  | that signal is delivered on entering every syscall specified by the | 
|  | .IR set . | 
|  |  | 
|  | If :\fBdelay_enter\fR=\,\fIusecs\/\fR or :\fBdelay_exit\fR=\,\fIusecs\/\fR | 
|  | options are specified, delay injection is performed: the tracee is delayed | 
|  | by at least | 
|  | .IR usecs | 
|  | microseconds on entering or exiting the syscall. | 
|  |  | 
|  | If :\fBsignal\fR=\,\fIsig\/\fR option is specified without | 
|  | :\fBerror\fR=\,\fIerrno\/\fR, :\fBretval\fR=\,\fIvalue\/\fR or | 
|  | :\fBdelay_{enter,exit}\fR=\,\fIusecs\/\fR options, | 
|  | then only a signal | 
|  | .I sig | 
|  | is delivered without a syscall fault or delay injection. | 
|  | Conversely, :\fBerror\fR=\,\fIerrno\/\fR or | 
|  | :\fBretval\fR=\,\fIvalue\/\fR option without | 
|  | :\fBdelay_enter\fR=\,\fIusecs\/\fR, | 
|  | :\fBdelay_exit\fR=\,\fIusecs\/\fR or | 
|  | :\fBsignal\fR=\,\fIsig\/\fR options injects a fault without delivering a signal | 
|  | or injecting a delay, etc. | 
|  |  | 
|  | If both :\fBerror\fR=\,\fIerrno\/\fR or :\fBretval\fR=\,\fIvalue\/\fR | 
|  | and :\fBsignal\fR=\,\fIsig\/\fR options are specified, then both | 
|  | a fault or success is injected and a signal is delivered. | 
|  |  | 
|  | if :\fBsyscall\fR=\fIsyscall\fR option is specified, the corresponding syscall | 
|  | with no side effects is injected instead of -1. | 
|  | Currently, only "pure" (see | 
|  | .BR "-e trace" = "%pure" | 
|  | description) syscalls can be specified there. | 
|  |  | 
|  | Unless a :\fBwhen\fR=\,\fIexpr\fR subexpression is specified, | 
|  | an injection is being made into every invocation of each syscall from the | 
|  | .IR set . | 
|  |  | 
|  | The format of the subexpression is one of the following: | 
|  | .RS | 
|  | .IP "" 2 | 
|  | .I first | 
|  | .RS 4 | 
|  | For every syscall from the | 
|  | .IR set , | 
|  | perform an injection for the syscall invocation number | 
|  | .I first | 
|  | only. | 
|  | .RE | 
|  | .IP "" 2 | 
|  | \fIfirst\/\fB+\fR | 
|  | .RS 4 | 
|  | For every syscall from the | 
|  | .IR set , | 
|  | perform injections for the syscall invocation number | 
|  | .I first | 
|  | and all subsequent invocations. | 
|  | .RE | 
|  | .IP "" 2 | 
|  | \fIfirst\/\fB+\fIstep\fR | 
|  | .RS 4 | 
|  | For every syscall from the | 
|  | .IR set , | 
|  | perform injections for syscall invocations number | 
|  | .IR first , | 
|  | .IR first + step , | 
|  | .IR first + step + step , | 
|  | and so on. | 
|  | .RE | 
|  | .RE | 
|  | .IP | 
|  | For example, to fail each third and subsequent chdir syscalls with | 
|  | .BR ENOENT , | 
|  | use | 
|  | \fB\-e\ inject\fR=\,\fIchdir\/\fR:\fBerror\fR=\,\fIENOENT\/\fR:\fBwhen\fR=\,\fI3\/\fB+\fR. | 
|  |  | 
|  | The valid range for numbers | 
|  | .I first | 
|  | and | 
|  | .I step | 
|  | is 1..65535. | 
|  |  | 
|  | An injection expression can contain only one | 
|  | .BR error = | 
|  | or | 
|  | .BR retval = | 
|  | specification, and only one | 
|  | .BR signal = | 
|  | specification.  If an injection expression contains multiple | 
|  | .BR when = | 
|  | specifications, the last one takes precedence. | 
|  |  | 
|  | Accounting of syscalls that are subject to injection | 
|  | is done per syscall and per tracee. | 
|  |  | 
|  | Specification of syscall injection can be combined | 
|  | with other syscall filtering options, for example, | 
|  | \fB\-P \fI/dev/urandom \fB\-e inject\fR=\,\fIfile\/\fR:\fBerror\fR=\,\fIENOENT\fR. | 
|  |  | 
|  | .TP | 
|  | \fB\-e\ fault\fR=\,\fIset\/\fR[:\fBerror\fR=\,\fIerrno\/\fR][:\fBwhen\fR=\,\fIexpr\/\fR] | 
|  | Perform syscall fault injection for the specified set of syscalls. | 
|  |  | 
|  | This is equivalent to more generic | 
|  | \fB\-e\ inject\fR= expression with default value of | 
|  | .I errno | 
|  | option set to | 
|  | .IR ENOSYS . | 
|  |  | 
|  | .TP | 
|  | .BR "\-e\ kvm" = vcpu | 
|  | Print the exit reason of kvm vcpu.  Requires Linux kernel version 4.16.0 | 
|  | or higher. | 
|  |  | 
|  | .TP | 
|  | .BI "\-P " path | 
|  | Trace only system calls accessing | 
|  | .IR path . | 
|  | Multiple | 
|  | .B \-P | 
|  | options can be used to specify several paths. | 
|  | .TP | 
|  | .B \-v | 
|  | Print unabbreviated versions of environment, stat, termios, etc. | 
|  | calls.  These structures are very common in calls and so the default | 
|  | behavior displays a reasonable subset of structure members.  Use | 
|  | this option to get all of the gory details. | 
|  | .SS Tracing | 
|  | .TP 12 | 
|  | .BI "\-b " syscall | 
|  | If specified syscall is reached, detach from traced process. | 
|  | Currently, only | 
|  | .I execve | 
|  | syscall is supported.  This option is useful if you want to trace | 
|  | multi-threaded process and therefore require -f, but don't want | 
|  | to trace its (potentially very complex) children. | 
|  | .TP | 
|  | .B \-D | 
|  | Run tracer process as a detached grandchild, not as parent of the | 
|  | tracee.  This reduces the visible effect of | 
|  | .B strace | 
|  | by keeping the tracee a direct child of the calling process. | 
|  | .TP | 
|  | .B \-f | 
|  | Trace child processes as they are created by currently traced | 
|  | processes as a result of the | 
|  | .BR fork (2), | 
|  | .BR vfork (2) | 
|  | and | 
|  | .BR clone (2) | 
|  | system calls.  Note that | 
|  | .B \-p | 
|  | .I PID | 
|  | .B \-f | 
|  | will attach all threads of process PID if it is multi-threaded, | 
|  | not only thread with thread_id = PID. | 
|  | .TP | 
|  | .B \-ff | 
|  | If the | 
|  | .B \-o | 
|  | .I filename | 
|  | option is in effect, each processes trace is written to | 
|  | .I filename.pid | 
|  | where pid is the numeric process id of each process. | 
|  | This is incompatible with | 
|  | .BR \-c , | 
|  | since no per-process counts are kept. | 
|  |  | 
|  | One might want to consider using | 
|  | .BR strace-log-merge (1) | 
|  | to obtain a combined strace log view. | 
|  | .TP | 
|  | .BI "\-I " interruptible | 
|  | When strace can be interrupted by signals (such as pressing ^C). | 
|  | 1: no signals are blocked; 2: fatal signals are blocked while decoding syscall | 
|  | (default); 3: fatal signals are always blocked (default if '-o FILE PROG'); | 
|  | 4: fatal signals and SIGTSTP (^Z) are always blocked (useful to make | 
|  | strace -o FILE PROG not stop on ^Z). | 
|  | .SS Startup | 
|  | .TP 12 | 
|  | \fB\-E\ \fIvar\fR=\,\fIval\fR | 
|  | Run command with | 
|  | .IR var = val | 
|  | in its list of environment variables. | 
|  | .TP | 
|  | .BI "\-E " var | 
|  | Remove | 
|  | .IR var | 
|  | from the inherited list of environment variables before passing it on to | 
|  | the command. | 
|  | .TP | 
|  | .BI "\-p " pid | 
|  | Attach to the process with the process | 
|  | .SM ID | 
|  | .I pid | 
|  | and begin tracing. | 
|  | The trace may be terminated | 
|  | at any time by a keyboard interrupt signal (\c | 
|  | .SM CTRL\s0-C). | 
|  | .B strace | 
|  | will respond by detaching itself from the traced process(es) | 
|  | leaving it (them) to continue running. | 
|  | Multiple | 
|  | .B \-p | 
|  | options can be used to attach to many processes in addition to | 
|  | .I command | 
|  | (which is optional if at least one | 
|  | .B \-p | 
|  | option is given). | 
|  | .B \-p | 
|  | "`pidof PROG`" syntax is supported. | 
|  | .TP | 
|  | .BI "\-u " username | 
|  | Run command with the user \s-1ID\s0, group \s-2ID\s0, and | 
|  | supplementary groups of | 
|  | .IR username . | 
|  | This option is only useful when running as root and enables the | 
|  | correct execution of setuid and/or setgid binaries. | 
|  | Unless this option is used setuid and setgid programs are executed | 
|  | without effective privileges. | 
|  | .SS Miscellaneous | 
|  | .TP 12 | 
|  | .B \-d | 
|  | Show some debugging output of | 
|  | .B strace | 
|  | itself on the standard error. | 
|  | .TP | 
|  | .B \-F | 
|  | This option is deprecated.  It is retained for backward compatibility only | 
|  | and may be removed in future releases. | 
|  | Usage of multiple instances of | 
|  | .B \-F | 
|  | option is still equivalent to a single | 
|  | .BR \-f , | 
|  | and it is ignored at all if used along with one or more instances of | 
|  | .B \-f | 
|  | option. | 
|  | .TP | 
|  | .B \-h | 
|  | Print the help summary. | 
|  | .TP | 
|  | .B \-V | 
|  | Print the version number of | 
|  | .BR strace . | 
|  | .SH DIAGNOSTICS | 
|  | When | 
|  | .I command | 
|  | exits, | 
|  | .B strace | 
|  | exits with the same exit status. | 
|  | If | 
|  | .I command | 
|  | is terminated by a signal, | 
|  | .B strace | 
|  | terminates itself with the same signal, so that | 
|  | .B strace | 
|  | can be used as a wrapper process transparent to the invoking parent process. | 
|  | Note that parent-child relationship (signal stop notifications, | 
|  | getppid() value, etc) between traced process and its parent are not preserved | 
|  | unless | 
|  | .B \-D | 
|  | is used. | 
|  | .LP | 
|  | When using | 
|  | .B \-p | 
|  | without a | 
|  | .IR command , | 
|  | the exit status of | 
|  | .B strace | 
|  | is zero unless no processes has been attached or there was an unexpected error | 
|  | in doing the tracing. | 
|  | .SH "SETUID INSTALLATION" | 
|  | If | 
|  | .B strace | 
|  | is installed setuid to root then the invoking user will be able to | 
|  | attach to and trace processes owned by any user. | 
|  | In addition setuid and setgid programs will be executed and traced | 
|  | with the correct effective privileges. | 
|  | Since only users trusted with full root privileges should be allowed | 
|  | to do these things, | 
|  | it only makes sense to install | 
|  | .B strace | 
|  | as setuid to root when the users who can execute it are restricted | 
|  | to those users who have this trust. | 
|  | For example, it makes sense to install a special version of | 
|  | .B strace | 
|  | with mode 'rwsr-xr--', user | 
|  | .B root | 
|  | and group | 
|  | .BR trace , | 
|  | where members of the | 
|  | .B trace | 
|  | group are trusted users. | 
|  | If you do use this feature, please remember to install | 
|  | a regular non-setuid version of | 
|  | .B strace | 
|  | for ordinary users to use. | 
|  | .SH "MULTIPLE PERSONALITY SUPPORT" | 
|  | On some architectures, | 
|  | .B strace | 
|  | supports decoding of syscalls for processes that use different ABI rather than | 
|  | the one | 
|  | .B strace | 
|  | uses. | 
|  | Specifically, in addition to decoding native ABI, | 
|  | .B strace | 
|  | can decode the following ABIs on the following architectures: | 
|  | .TS H | 
|  | allbox; | 
|  | lb lb | 
|  | l l. | 
|  | Architecture	ABIs supported | 
|  | x86_64	i386, x32 (when built as an x86_64 application); i386 (when built as an x32 application) | 
|  | AArch64	ARM 32-bit EABI | 
|  | PowerPC 64-bit	PowerPC 32-bit | 
|  | RISC-V 64-bit	RISC-V 32-bit | 
|  | s390x	s390 | 
|  | SPARC 64-bit	SPARC 32-bit | 
|  | TILE 64-bit	TILE 32-bit | 
|  | .TE | 
|  | .PP | 
|  | This support is optional and relies on ability to generate and parse structure | 
|  | definitions during the build time. | 
|  | Please refer to the output of the | 
|  | .B strace \-V | 
|  | command in order to figure out what support is available in your strace build | 
|  | ("non-native" refers to an ABI that differs from the ABI strace has): | 
|  | .TP 15 | 
|  | .B m32-mpers | 
|  | .B strace | 
|  | can trace and properly decode non-native 32-bit binaries. | 
|  | .TP | 
|  | .B no-m32-mpers | 
|  | .B strace | 
|  | can trace, but cannot properly decode non-native 32-bit binaries. | 
|  | .TP | 
|  | .B mx32-mpers | 
|  | .B strace | 
|  | can trace and properly decode non-native 32-on-64-bit binaries. | 
|  | .TP | 
|  | .B no-mx32-mpers | 
|  | .B strace | 
|  | can trace, but cannot properly decode non-native 32-on-64-bit binaries. | 
|  | .PP | 
|  | If the output contains neither | 
|  | .B m32-mpers | 
|  | nor | 
|  | .BR no-m32-mpers , | 
|  | then decoding of non-native 32-bit binaries is not implemented at all | 
|  | or not applicable. | 
|  | .PP | 
|  | Likewise, if the output contains neither | 
|  | .B mx32-mpers | 
|  | nor | 
|  | .BR no-mx32-mpers , | 
|  | then decoding of non-native 32-on-64-bit binaries is not implemented at all | 
|  | or not applicable. | 
|  | .SH NOTES | 
|  | It is a pity that so much tracing clutter is produced by systems | 
|  | employing shared libraries. | 
|  | .LP | 
|  | It is instructive to think about system call inputs and outputs | 
|  | as data-flow across the user/kernel boundary.  Because user-space | 
|  | and kernel-space are separate and address-protected, it is | 
|  | sometimes possible to make deductive inferences about process | 
|  | behavior using inputs and outputs as propositions. | 
|  | .LP | 
|  | In some cases, a system call will differ from the documented behavior | 
|  | or have a different name.  For example, the | 
|  | .BR faccessat (2) | 
|  | system call does not have | 
|  | .I flags | 
|  | argument, and the | 
|  | .BR setrlimit (2) | 
|  | library function uses | 
|  | .BR prlimit64 (2) | 
|  | system call on modern (2.6.38+) kernels.  These | 
|  | discrepancies are normal but idiosyncratic characteristics of the | 
|  | system call interface and are accounted for by C library wrapper | 
|  | functions. | 
|  | .LP | 
|  | Some system calls have different names in different architectures and | 
|  | personalities.  In these cases, system call filtering and printing | 
|  | uses the names that match corresponding | 
|  | .BR __NR_ * | 
|  | kernel macros of the tracee's architecture and personality. | 
|  | There are two exceptions from this general rule: | 
|  | .BR arm_fadvise64_64 (2) | 
|  | ARM syscall and | 
|  | .BR xtensa_fadvise64_64 (2) | 
|  | Xtensa syscall are filtered and printed as | 
|  | .BR fadvise64_64 (2). | 
|  | .LP | 
|  | On x32, syscalls that are intended to be used by 64-bit processes and not x32 | 
|  | ones (for example, | 
|  | .BR readv , | 
|  | that has syscall number 19 on x86_64, with its x32 counterpart has syscall | 
|  | number 515), but called with | 
|  | .B __X32_SYSCALL_BIT | 
|  | flag being set, are designated with "#64" suffix. | 
|  | .LP | 
|  | On some platforms a process that is attached to with the | 
|  | .B \-p | 
|  | option may observe a spurious EINTR return from the current | 
|  | system call that is not restartable.  (Ideally, all system calls | 
|  | should be restarted on strace attach, making the attach invisible | 
|  | to the traced process, but a few system calls aren't. | 
|  | Arguably, every instance of such behavior is a kernel bug.) | 
|  | This may have an unpredictable effect on the process | 
|  | if the process takes no action to restart the system call. | 
|  | .LP | 
|  | As | 
|  | .B strace | 
|  | executes the specified | 
|  | .I command | 
|  | directly and does not employ a shell for that, scripts without shebang | 
|  | that usually run just fine when invoked by shell fail to execute with | 
|  | .B ENOEXEC | 
|  | error. | 
|  | It is advisable to manually supply a shell as a | 
|  | .I command | 
|  | with the script as its argument. | 
|  | .SH BUGS | 
|  | Programs that use the | 
|  | .I setuid | 
|  | bit do not have | 
|  | effective user | 
|  | .SM ID | 
|  | privileges while being traced. | 
|  | .LP | 
|  | A traced process runs slowly. | 
|  | .LP | 
|  | Traced processes which are descended from | 
|  | .I command | 
|  | may be left running after an interrupt signal (\c | 
|  | .SM CTRL\s0-C). | 
|  | .SH HISTORY | 
|  | The original | 
|  | .B strace | 
|  | was written by Paul Kranenburg | 
|  | for SunOS and was inspired by its | 
|  | .B trace | 
|  | utility. | 
|  | The SunOS version of | 
|  | .B strace | 
|  | was ported to Linux and enhanced | 
|  | by Branko Lankester, who also wrote the Linux kernel support. | 
|  | Even though Paul released | 
|  | .B strace | 
|  | 2.5 in 1992, | 
|  | Branko's work was based on Paul's | 
|  | .B strace | 
|  | 1.5 release from 1991. | 
|  | In 1993, Rick Sladkey merged | 
|  | .B strace | 
|  | 2.5 for SunOS and the second release of | 
|  | .B strace | 
|  | for Linux, added many of the features of | 
|  | .BR truss (1) | 
|  | from SVR4, and produced an | 
|  | .B strace | 
|  | that worked on both platforms.  In 1994 Rick ported | 
|  | .B strace | 
|  | to SVR4 and Solaris and wrote the | 
|  | automatic configuration support.  In 1995 he ported | 
|  | .B strace | 
|  | to Irix | 
|  | and tired of writing about himself in the third person. | 
|  | .PP | 
|  | Beginning with 1996, | 
|  | .B strace | 
|  | was maintained by Wichert Akkerman. | 
|  | During his tenure, | 
|  | .B strace | 
|  | development migrated to CVS; ports to FreeBSD and many architectures on Linux | 
|  | (including ARM, IA-64, MIPS, PA-RISC, PowerPC, s390, SPARC) were introduced. | 
|  | In 2002, the burden of | 
|  | .B strace | 
|  | maintainership was transferred to Roland McGrath. | 
|  | Since then, | 
|  | .B strace | 
|  | gained support for several new Linux architectures (AMD64, s390x, SuperH), | 
|  | bi-architecture support for some of them, and received numerous additions and | 
|  | improvements in syscalls decoders on Linux; | 
|  | .B strace | 
|  | development migrated to | 
|  | .B git | 
|  | during that period. | 
|  | Since 2009, | 
|  | .B strace | 
|  | is actively maintained by Dmitry Levin. | 
|  | .B strace | 
|  | gained support for AArch64, ARC, AVR32, Blackfin, Meta, Nios II, OpenSISC 1000, | 
|  | RISC-V, Tile/TileGx, Xtensa architectures since that time. | 
|  | In 2012, unmaintained and apparently broken support for non-Linux operating | 
|  | systems was removed. | 
|  | Also, in 2012 | 
|  | .B strace | 
|  | gained support for path tracing and file descriptor path decoding. | 
|  | In 2014, support for stack traces printing was added. | 
|  | In 2016, syscall fault injection was implemented. | 
|  | .PP | 
|  | For the additional information, please refer to the | 
|  | .B NEWS | 
|  | file and | 
|  | .B strace | 
|  | repository commit log. | 
|  | .SH REPORTING BUGS | 
|  | Problems with | 
|  | .B strace | 
|  | should be reported to the | 
|  | .B strace | 
|  | mailing list at <strace\-devel@lists.strace.io>. | 
|  | .SH "SEE ALSO" | 
|  | .BR strace-log-merge (1), | 
|  | .BR ltrace (1), | 
|  | .BR perf-trace (1), | 
|  | .BR trace-cmd (1), | 
|  | .BR time (1), | 
|  | .BR ptrace (2), | 
|  | .BR proc (5) |