Home | History | Annotate | Download | only in strace
      1 /*
      2  * Copyright (c) 1991, 1992 Paul Kranenburg <pk (at) cs.few.eur.nl>
      3  * Copyright (c) 1993 Branko Lankester <branko (at) hacktic.nl>
      4  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs (at) world.std.com>
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  * 3. The name of the author may not be used to endorse or promote products
     16  *    derived from this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28  */
     29 
     30 #ifdef HAVE_CONFIG_H
     31 # include "config.h"
     32 #endif
     33 
     34 #ifdef MIPS
     35 # include <sgidefs.h>
     36 # if _MIPS_SIM == _MIPS_SIM_ABI64
     37 #  define LINUX_MIPSN64
     38 # elif _MIPS_SIM == _MIPS_SIM_NABI32
     39 #  define LINUX_MIPSN32
     40 # elif _MIPS_SIM == _MIPS_SIM_ABI32
     41 #  define LINUX_MIPSO32
     42 # else
     43 #  error Unsupported _MIPS_SIM
     44 # endif
     45 #endif
     46 
     47 #include <features.h>
     48 #ifdef HAVE_STDBOOL_H
     49 # include <stdbool.h>
     50 #endif
     51 #include <stdint.h>
     52 #include <inttypes.h>
     53 #include <sys/types.h>
     54 #ifdef STDC_HEADERS
     55 # include <stddef.h>
     56 #endif
     57 #include <unistd.h>
     58 #include <stdlib.h>
     59 #include <stdio.h>
     60 /* Open-coding isprint(ch) et al proved more efficient than calling
     61  * generalized libc interface. We don't *want* to do non-ASCII anyway.
     62  */
     63 /* #include <ctype.h> */
     64 #include <string.h>
     65 #include <errno.h>
     66 #include <signal.h>
     67 #include <time.h>
     68 #include <sys/time.h>
     69 #include <sys/syscall.h>
     70 
     71 #ifndef HAVE_STRERROR
     72 const char *strerror(int);
     73 #endif
     74 #ifndef HAVE_STPCPY
     75 /* Some libc have stpcpy, some don't. Sigh...
     76  * Roll our private implementation...
     77  */
     78 #undef stpcpy
     79 #define stpcpy strace_stpcpy
     80 extern char *stpcpy(char *dst, const char *src);
     81 #endif
     82 
     83 #if !defined __GNUC__
     84 # define __attribute__(x) /*nothing*/
     85 #endif
     86 
     87 #ifndef offsetof
     88 # define offsetof(type, member)	\
     89 	(((char *) &(((type *) NULL)->member)) - ((char *) (type *) NULL))
     90 #endif
     91 
     92 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
     93 
     94 /* macros */
     95 #ifndef MAX
     96 # define MAX(a, b)		(((a) > (b)) ? (a) : (b))
     97 #endif
     98 #ifndef MIN
     99 # define MIN(a, b)		(((a) < (b)) ? (a) : (b))
    100 #endif
    101 #define CLAMP(val, min, max) MIN(MAX(min, val), max)
    102 
    103 /* Glibc has an efficient macro for sigemptyset
    104  * (it just does one or two assignments of 0 to internal vector of longs).
    105  */
    106 #if defined(__GLIBC__) && defined(__sigemptyset) && !defined(sigemptyset)
    107 # define sigemptyset __sigemptyset
    108 #endif
    109 
    110 /* Configuration section */
    111 #ifndef DEFAULT_STRLEN
    112 /* default maximum # of bytes printed in `printstr', change with -s switch */
    113 # define DEFAULT_STRLEN	32
    114 #endif
    115 #ifndef DEFAULT_ACOLUMN
    116 # define DEFAULT_ACOLUMN	40	/* default alignment column for results */
    117 #endif
    118 /*
    119  * Maximum number of args to a syscall.
    120  *
    121  * Make sure that all entries in all syscallent.h files have nargs <= MAX_ARGS!
    122  * linux/<ARCH>/syscallent*.h:
    123  * 	all have nargs <= 6 except mips o32 which has nargs <= 7.
    124  */
    125 #ifndef MAX_ARGS
    126 # ifdef LINUX_MIPSO32
    127 #  define MAX_ARGS	7
    128 # else
    129 #  define MAX_ARGS	6
    130 # endif
    131 #endif
    132 /* default sorting method for call profiling */
    133 #ifndef DEFAULT_SORTBY
    134 # define DEFAULT_SORTBY "time"
    135 #endif
    136 /*
    137  * Experimental code using PTRACE_SEIZE can be enabled here.
    138  * This needs Linux kernel 3.4.x or later to work.
    139  */
    140 #define USE_SEIZE 1
    141 /* To force NOMMU build, set to 1 */
    142 #define NOMMU_SYSTEM 0
    143 /*
    144  * Set to 1 to use speed-optimized vfprintf implementation.
    145  * It results in strace using about 5% less CPU in user space
    146  * (compared to glibc version).
    147  * But strace spends a lot of time in kernel space,
    148  * so overall it does not appear to be a significant win.
    149  * Thus disabled by default.
    150  */
    151 #define USE_CUSTOM_PRINTF 0
    152 
    153 #ifdef NEED_PTRACE_PROTOTYPE_WORKAROUND
    154 # define ptrace xptrace
    155 # include <sys/ptrace.h>
    156 # undef ptrace
    157 extern long ptrace(int, int, char *, long);
    158 #else
    159 # include <sys/ptrace.h>
    160 #endif
    161 
    162 #if defined(POWERPC)
    163 # include <asm/ptrace.h>
    164 #endif
    165 
    166 #if defined(TILE)
    167 # include <asm/ptrace.h>  /* struct pt_regs */
    168 #endif
    169 
    170 #ifndef ERESTARTSYS
    171 # define ERESTARTSYS    512
    172 #endif
    173 #ifndef ERESTARTNOINTR
    174 # define ERESTARTNOINTR 513
    175 #endif
    176 #ifndef ERESTARTNOHAND
    177 # define ERESTARTNOHAND 514
    178 #endif
    179 #ifndef ERESTART_RESTARTBLOCK
    180 # define ERESTART_RESTARTBLOCK 516
    181 #endif
    182 
    183 #if !HAVE_DECL_PTRACE_SETOPTIONS
    184 # define PTRACE_SETOPTIONS	0x4200
    185 #endif
    186 #if !HAVE_DECL_PTRACE_GETEVENTMSG
    187 # define PTRACE_GETEVENTMSG	0x4201
    188 #endif
    189 #if !HAVE_DECL_PTRACE_GETSIGINFO
    190 # define PTRACE_GETSIGINFO	0x4202
    191 #endif
    192 
    193 #if !HAVE_DECL_PTRACE_O_TRACESYSGOOD
    194 # define PTRACE_O_TRACESYSGOOD	0x00000001
    195 #endif
    196 #if !HAVE_DECL_PTRACE_O_TRACEFORK
    197 # define PTRACE_O_TRACEFORK	0x00000002
    198 #endif
    199 #if !HAVE_DECL_PTRACE_O_TRACEVFORK
    200 # define PTRACE_O_TRACEVFORK	0x00000004
    201 #endif
    202 #if !HAVE_DECL_PTRACE_O_TRACECLONE
    203 # define PTRACE_O_TRACECLONE	0x00000008
    204 #endif
    205 #if !HAVE_DECL_PTRACE_O_TRACEEXEC
    206 # define PTRACE_O_TRACEEXEC	0x00000010
    207 #endif
    208 #if !HAVE_DECL_PTRACE_O_TRACEEXIT
    209 # define PTRACE_O_TRACEEXIT	0x00000040
    210 #endif
    211 
    212 #if !HAVE_DECL_PTRACE_EVENT_FORK
    213 # define PTRACE_EVENT_FORK	1
    214 #endif
    215 #if !HAVE_DECL_PTRACE_EVENT_VFORK
    216 # define PTRACE_EVENT_VFORK	2
    217 #endif
    218 #if !HAVE_DECL_PTRACE_EVENT_CLONE
    219 # define PTRACE_EVENT_CLONE	3
    220 #endif
    221 #if !HAVE_DECL_PTRACE_EVENT_EXEC
    222 # define PTRACE_EVENT_EXEC	4
    223 #endif
    224 #if !HAVE_DECL_PTRACE_EVENT_VFORK_DONE
    225 # define PTRACE_EVENT_VFORK_DONE	5
    226 #endif
    227 #if !HAVE_DECL_PTRACE_EVENT_EXIT
    228 # define PTRACE_EVENT_EXIT	6
    229 #endif
    230 
    231 #if !HAVE_DECL_PTRACE_PEEKUSER
    232 # define PTRACE_PEEKUSER PTRACE_PEEKUSR
    233 #endif
    234 #if !HAVE_DECL_PTRACE_POKEUSER
    235 # define PTRACE_POKEUSER PTRACE_POKEUSR
    236 #endif
    237 
    238 #undef PTRACE_SEIZE
    239 #define PTRACE_SEIZE		0x4206
    240 #undef PTRACE_INTERRUPT
    241 #define PTRACE_INTERRUPT	0x4207
    242 #undef PTRACE_LISTEN
    243 #define PTRACE_LISTEN		0x4208
    244 #undef PTRACE_EVENT_STOP
    245 #define PTRACE_EVENT_STOP	128
    246 
    247 #ifdef ALPHA
    248 # define REG_R0 0
    249 # define REG_A0 16
    250 # define REG_A3 19
    251 # define REG_FP 30
    252 # define REG_PC 64
    253 #endif /* ALPHA */
    254 #ifdef MIPS
    255 # define REG_V0 2
    256 # define REG_A0 4
    257 # define REG_A3 7
    258 # define REG_SP 29
    259 # define REG_EPC 64
    260 #endif /* MIPS */
    261 #ifdef HPPA
    262 # define PT_GR20 (20*4)
    263 # define PT_GR26 (26*4)
    264 # define PT_GR28 (28*4)
    265 # define PT_IAOQ0 (106*4)
    266 # define PT_IAOQ1 (107*4)
    267 #endif /* HPPA */
    268 #ifdef SH64
    269    /* SH64 Linux - this code assumes the following kernel API for system calls:
    270           PC           Offset 0
    271           System Call  Offset 16 (actually, (syscall no.) | (0x1n << 16),
    272                        where n = no. of parameters.
    273           Other regs   Offset 24+
    274 
    275           On entry:    R2-7 = parameters 1-6 (as many as necessary)
    276           On return:   R9   = result. */
    277 
    278    /* Offset for peeks of registers */
    279 # define REG_OFFSET         (24)
    280 # define REG_GENERAL(x)     (8*(x)+REG_OFFSET)
    281 # define REG_PC             (0*8)
    282 # define REG_SYSCALL        (2*8)
    283 #endif /* SH64 */
    284 #ifdef AARCH64
    285 struct arm_pt_regs {
    286         int uregs[18];
    287 };
    288 # define ARM_cpsr       uregs[16]
    289 # define ARM_pc         uregs[15]
    290 # define ARM_lr         uregs[14]
    291 # define ARM_sp         uregs[13]
    292 # define ARM_ip         uregs[12]
    293 # define ARM_fp         uregs[11]
    294 # define ARM_r10        uregs[10]
    295 # define ARM_r9         uregs[9]
    296 # define ARM_r8         uregs[8]
    297 # define ARM_r7         uregs[7]
    298 # define ARM_r6         uregs[6]
    299 # define ARM_r5         uregs[5]
    300 # define ARM_r4         uregs[4]
    301 # define ARM_r3         uregs[3]
    302 # define ARM_r2         uregs[2]
    303 # define ARM_r1         uregs[1]
    304 # define ARM_r0         uregs[0]
    305 # define ARM_ORIG_r0    uregs[17]
    306 #endif /* AARCH64 */
    307 
    308 #if defined(SPARC) || defined(SPARC64)
    309 /* Indexes into the pt_regs.u_reg[] array -- UREG_XX from kernel are all off
    310  * by 1 and use Ix instead of Ox.  These work for both 32 and 64 bit Linux. */
    311 # define U_REG_G1 0
    312 # define U_REG_O0 7
    313 # define U_REG_O1 8
    314 # define PERSONALITY0_WORDSIZE 4
    315 # define PERSONALITY1_WORDSIZE 4
    316 # if defined(SPARC64)
    317 #  include <asm/psrcompat.h>
    318 #  define SUPPORTED_PERSONALITIES 3
    319 #  define PERSONALITY2_WORDSIZE 8
    320 # else
    321 #  include <asm/psr.h>
    322 #  define SUPPORTED_PERSONALITIES 2
    323 # endif /* SPARC64 */
    324 #endif /* SPARC[64] */
    325 
    326 #ifdef X86_64
    327 # define SUPPORTED_PERSONALITIES 3
    328 # define PERSONALITY0_WORDSIZE 8
    329 # define PERSONALITY1_WORDSIZE 4
    330 # define PERSONALITY2_WORDSIZE 4
    331 #endif
    332 
    333 #ifdef X32
    334 # define SUPPORTED_PERSONALITIES 2
    335 # define PERSONALITY0_WORDSIZE 4
    336 # define PERSONALITY1_WORDSIZE 4
    337 #endif
    338 
    339 #ifdef ARM
    340 /* one personality */
    341 #endif
    342 
    343 #ifdef AARCH64
    344 /* The existing ARM personality, then AArch64 */
    345 # define SUPPORTED_PERSONALITIES 2
    346 # define PERSONALITY0_WORDSIZE 4
    347 # define PERSONALITY1_WORDSIZE 8
    348 # define DEFAULT_PERSONALITY 1
    349 #endif
    350 
    351 #ifdef POWERPC64
    352 # define SUPPORTED_PERSONALITIES 2
    353 # define PERSONALITY0_WORDSIZE 8
    354 # define PERSONALITY1_WORDSIZE 4
    355 #endif
    356 
    357 #ifdef TILE
    358 # define SUPPORTED_PERSONALITIES 2
    359 # define PERSONALITY0_WORDSIZE 8
    360 # define PERSONALITY1_WORDSIZE 4
    361 # ifdef __tilepro__
    362 #  define DEFAULT_PERSONALITY 1
    363 # endif
    364 #endif
    365 
    366 #ifndef SUPPORTED_PERSONALITIES
    367 # define SUPPORTED_PERSONALITIES 1
    368 #endif
    369 #ifndef DEFAULT_PERSONALITY
    370 # define DEFAULT_PERSONALITY 0
    371 #endif
    372 #ifndef PERSONALITY0_WORDSIZE
    373 # define PERSONALITY0_WORDSIZE SIZEOF_LONG
    374 #endif
    375 
    376 #if defined(I386) || defined(X86_64)
    377 extern uint32_t *const i386_esp_ptr;
    378 #elif defined(IA64)
    379 extern bool ia64_ia32mode;
    380 #elif defined(SPARC) || defined(SPARC64)
    381 extern struct pt_regs sparc_regs;
    382 #elif defined(ARM)
    383 extern struct pt_regs arm_regs;
    384 #elif defined(TILE)
    385 extern struct pt_regs tile_regs;
    386 #elif defined(POWERPC)
    387 extern struct pt_regs ppc_regs;
    388 #endif
    389 
    390 typedef struct sysent {
    391 	unsigned nargs;
    392 	int	sys_flags;
    393 	int	(*sys_func)();
    394 	const char *sys_name;
    395 } struct_sysent;
    396 
    397 typedef struct ioctlent {
    398 	const char *doth;
    399 	const char *symbol;
    400 	unsigned long code;
    401 } struct_ioctlent;
    402 
    403 /* Trace Control Block */
    404 struct tcb {
    405 	int flags;		/* See below for TCB_ values */
    406 	int pid;		/* If 0, this tcb is free */
    407 	int qual_flg;		/* qual_flags[scno] or DEFAULT_QUAL_FLAGS + RAW */
    408 	int u_error;		/* Error code */
    409 	long scno;		/* System call number */
    410 	long u_arg[MAX_ARGS];	/* System call arguments */
    411 #if defined(LINUX_MIPSN32) || defined(X32)
    412 	long long ext_arg[MAX_ARGS];
    413 	long long u_lrval;	/* long long return value */
    414 #endif
    415 	long u_rval;		/* Return value */
    416 #if SUPPORTED_PERSONALITIES > 1
    417 	int currpers;		/* Personality at the time of scno update */
    418 #endif
    419 	int curcol;		/* Output column for this process */
    420 	FILE *outf;		/* Output file for this process */
    421 	const char *auxstr;	/* Auxiliary info from syscall (see RVAL_STR) */
    422 	const struct_sysent *s_ent; /* sysent[scno] or dummy struct for bad scno */
    423 	struct timeval stime;	/* System time usage as of last process wait */
    424 	struct timeval dtime;	/* Delta for system time usage */
    425 	struct timeval etime;	/* Syscall entry time */
    426 				/* Support for tracing forked processes: */
    427 	long inst[2];		/* Saved clone args (badly named) */
    428 
    429 #ifdef USE_LIBUNWIND
    430 	struct UPT_info* libunwind_ui;
    431 	struct mmap_cache_t* mmap_cache;
    432 	unsigned int mmap_cache_size;
    433 	unsigned int mmap_cache_generation;
    434 	struct queue_t* queue;
    435 #endif
    436 };
    437 
    438 /* TCB flags */
    439 /* We have attached to this process, but did not see it stopping yet */
    440 #define TCB_STARTUP		0x01
    441 #define TCB_IGNORE_ONE_SIGSTOP	0x02	/* Next SIGSTOP is to be ignored */
    442 /*
    443  * Are we in system call entry or in syscall exit?
    444  *
    445  * This bit is set after all syscall entry processing is done.
    446  * Therefore, this bit will be set when next ptrace stop occurs,
    447  * which should be syscall exit stop. Other stops which are possible
    448  * directly after syscall entry (death, ptrace event stop)
    449  * are simpler and handled without calling trace_syscall(), therefore
    450  * the places where TCB_INSYSCALL can be set but we aren't in syscall stop
    451  * are limited to trace(), this condition is never observed in trace_syscall()
    452  * and below.
    453  * The bit is cleared after all syscall exit processing is done.
    454  * User-generated SIGTRAPs and post-execve SIGTRAP make it necessary
    455  * to be very careful and NOT set TCB_INSYSCALL bit when they are encountered.
    456  * TCB_WAITEXECVE bit is used for this purpose (see below).
    457  *
    458  * Use entering(tcp) / exiting(tcp) to check this bit to make code more readable.
    459  */
    460 #define TCB_INSYSCALL	0x04
    461 #define TCB_ATTACHED	0x08	/* We attached to it already */
    462 #define TCB_BPTSET	0x10	/* "Breakpoint" set after fork(2) */
    463 #define TCB_REPRINT	0x20	/* We should reprint this syscall on exit */
    464 #define TCB_FILTERED	0x40	/* This system call has been filtered out */
    465 /*
    466  * x86 does not need TCB_WAITEXECVE.
    467  * It can detect post-execve SIGTRAP by looking at eax/rax.
    468  * See "not a syscall entry (eax = %ld)\n" message.
    469  *
    470  * Note! On new kernels (about 2.5.46+), we use PTRACE_O_TRACEEXEC, which
    471  * suppresses post-execve SIGTRAP. If you are adding a new arch which is
    472  * only supported by newer kernels, you most likely don't need to define
    473  * TCB_WAITEXECVE!
    474  */
    475 #if defined(ALPHA) \
    476  || defined(SPARC) || defined(SPARC64) \
    477  || defined(POWERPC) \
    478  || defined(IA64) \
    479  || defined(HPPA) \
    480  || defined(SH) || defined(SH64) \
    481  || defined(S390) || defined(S390X) \
    482  || defined(ARM) \
    483  || defined(MIPS)
    484 /* This tracee has entered into execve syscall. Expect post-execve SIGTRAP
    485  * to happen. (When it is detected, tracee is continued and this bit is cleared.)
    486  */
    487 # define TCB_WAITEXECVE	0x80
    488 #endif
    489 
    490 /* qualifier flags */
    491 #define QUAL_TRACE	0x001	/* this system call should be traced */
    492 #define QUAL_ABBREV	0x002	/* abbreviate the structures of this syscall */
    493 #define QUAL_VERBOSE	0x004	/* decode the structures of this syscall */
    494 #define QUAL_RAW	0x008	/* print all args in hex for this syscall */
    495 #define QUAL_SIGNAL	0x010	/* report events with this signal */
    496 #define QUAL_READ	0x020	/* dump data read on this file descriptor */
    497 #define QUAL_WRITE	0x040	/* dump data written to this file descriptor */
    498 typedef uint8_t qualbits_t;
    499 #define UNDEFINED_SCNO	0x100	/* Used only in tcp->qual_flg */
    500 
    501 #define DEFAULT_QUAL_FLAGS (QUAL_TRACE | QUAL_ABBREV | QUAL_VERBOSE)
    502 
    503 #define entering(tcp)	(!((tcp)->flags & TCB_INSYSCALL))
    504 #define exiting(tcp)	((tcp)->flags & TCB_INSYSCALL)
    505 #define syserror(tcp)	((tcp)->u_error != 0)
    506 #define verbose(tcp)	((tcp)->qual_flg & QUAL_VERBOSE)
    507 #define abbrev(tcp)	((tcp)->qual_flg & QUAL_ABBREV)
    508 #define filtered(tcp)	((tcp)->flags & TCB_FILTERED)
    509 
    510 struct xlat {
    511 	int val;
    512 	const char *str;
    513 };
    514 #define XLAT(x) { x, #x }
    515 #define XLAT_END { 0, NULL }
    516 
    517 extern const struct xlat open_mode_flags[];
    518 extern const struct xlat addrfams[];
    519 extern const struct xlat struct_user_offsets[];
    520 extern const struct xlat open_access_modes[];
    521 extern const struct xlat whence_codes[];
    522 
    523 /* Format of syscall return values */
    524 #define RVAL_DECIMAL	000	/* decimal format */
    525 #define RVAL_HEX	001	/* hex format */
    526 #define RVAL_OCTAL	002	/* octal format */
    527 #define RVAL_UDECIMAL	003	/* unsigned decimal format */
    528 #if defined(LINUX_MIPSN32) || defined(X32)
    529 # if 0 /* unused so far */
    530 #  define RVAL_LDECIMAL	004	/* long decimal format */
    531 #  define RVAL_LHEX	005	/* long hex format */
    532 #  define RVAL_LOCTAL	006	/* long octal format */
    533 # endif
    534 # define RVAL_LUDECIMAL	007	/* long unsigned decimal format */
    535 #endif
    536 #define RVAL_FD		010	/* file descriptor */
    537 #define RVAL_MASK	017	/* mask for these values */
    538 
    539 #define RVAL_STR	020	/* Print `auxstr' field after return val */
    540 #define RVAL_NONE	040	/* Print nothing */
    541 
    542 #define TRACE_FILE	001	/* Trace file-related syscalls. */
    543 #define TRACE_IPC	002	/* Trace IPC-related syscalls. */
    544 #define TRACE_NETWORK	004	/* Trace network-related syscalls. */
    545 #define TRACE_PROCESS	010	/* Trace process-related syscalls. */
    546 #define TRACE_SIGNAL	020	/* Trace signal-related syscalls. */
    547 #define TRACE_DESC	040	/* Trace file descriptor-related syscalls. */
    548 #define TRACE_MEMORY	0100	/* Trace memory mapping-related syscalls. */
    549 #define SYSCALL_NEVER_FAILS	0200	/* Syscall is always successful. */
    550 #define STACKTRACE_INVALIDATE_CACHE 0400  /* Trigger proc/maps cache updating */
    551 #define STACKTRACE_CAPTURE_ON_ENTER 01000 /* Capture stacktrace on "entering" stage */
    552 
    553 typedef enum {
    554 	CFLAG_NONE = 0,
    555 	CFLAG_ONLY_STATS,
    556 	CFLAG_BOTH
    557 } cflag_t;
    558 extern cflag_t cflag;
    559 extern bool debug_flag;
    560 extern bool Tflag;
    561 extern bool iflag;
    562 extern bool count_wallclock;
    563 extern unsigned int qflag;
    564 extern bool not_failing_only;
    565 extern bool show_fd_path;
    566 extern bool hide_log_until_execve;
    567 /* are we filtering traces based on paths? */
    568 extern const char **paths_selected;
    569 #define tracing_paths (paths_selected != NULL)
    570 extern bool need_fork_exec_workarounds;
    571 extern unsigned xflag;
    572 extern unsigned followfork;
    573 #ifdef USE_LIBUNWIND
    574 /* if this is true do the stack trace for every system call */
    575 extern bool stack_trace_enabled;
    576 #endif
    577 extern unsigned ptrace_setoptions;
    578 extern unsigned max_strlen;
    579 extern unsigned os_release;
    580 #undef KERNEL_VERSION
    581 #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
    582 
    583 enum bitness_t { BITNESS_CURRENT = 0, BITNESS_32 };
    584 
    585 void error_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
    586 void perror_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
    587 void error_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2)));
    588 void perror_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2)));
    589 void die_out_of_memory(void) __attribute__ ((noreturn));
    590 
    591 #if USE_CUSTOM_PRINTF
    592 /*
    593  * See comment in vsprintf.c for allowed formats.
    594  * Short version: %h[h]u, %zu, %tu are not allowed, use %[l[l]]u.
    595  */
    596 int strace_vfprintf(FILE *fp, const char *fmt, va_list args);
    597 #else
    598 # define strace_vfprintf vfprintf
    599 #endif
    600 
    601 extern void set_sortby(const char *);
    602 extern void set_overhead(int);
    603 extern void qualify(const char *);
    604 extern void print_pc(struct tcb *);
    605 extern int trace_syscall(struct tcb *);
    606 extern void count_syscall(struct tcb *, const struct timeval *);
    607 extern void call_summary(FILE *);
    608 
    609 #if defined(AVR32) \
    610  || defined(I386) \
    611  || defined(X86_64) || defined(X32) \
    612  || defined(AARCH64) \
    613  || defined(ARM) \
    614  || defined(SPARC) || defined(SPARC64) \
    615  || defined(TILE) \
    616  || defined(OR1K) \
    617  || defined(METAG) \
    618  || defined(ARC) \
    619  || defined(POWERPC)
    620 extern long get_regs_error;
    621 # define clear_regs()  (get_regs_error = -1)
    622 extern void get_regs(pid_t pid);
    623 #else
    624 # define get_regs_error 0
    625 # define clear_regs()  ((void)0)
    626 # define get_regs(pid) ((void)0)
    627 #endif
    628 extern int umoven(struct tcb *, long, int, char *);
    629 #define umove(pid, addr, objp)	\
    630 	umoven((pid), (addr), sizeof(*(objp)), (char *) (objp))
    631 extern int umovestr(struct tcb *, long, int, char *);
    632 extern int upeek(int pid, long, long *);
    633 #if defined(SPARC) || defined(SPARC64) || defined(IA64) || defined(SH)
    634 extern long getrval2(struct tcb *);
    635 #endif
    636 /*
    637  * On Linux, "setbpt" is a misnomer: we don't set a breakpoint
    638  * (IOW: no poking in user's text segment),
    639  * instead we change fork/vfork/clone into clone(CLONE_PTRACE).
    640  * On newer kernels, we use PTRACE_O_TRACECLONE/TRACE[V]FORK instead.
    641  */
    642 extern int setbpt(struct tcb *);
    643 extern int clearbpt(struct tcb *);
    644 
    645 extern const char *signame(int);
    646 extern void pathtrace_select(const char *);
    647 extern int pathtrace_match(struct tcb *);
    648 extern int getfdpath(struct tcb *, int, char *, unsigned);
    649 
    650 extern const char *xlookup(const struct xlat *, int);
    651 
    652 extern int string_to_uint(const char *str);
    653 extern int string_quote(const char *, char *, long, int);
    654 extern int next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_bits);
    655 
    656 /* a refers to the lower numbered u_arg,
    657  * b refers to the higher numbered u_arg
    658  */
    659 #if HAVE_LITTLE_ENDIAN_LONG_LONG
    660 # define LONG_LONG(a,b) \
    661 	((long long)((unsigned long long)(unsigned)(a) | ((unsigned long long)(b)<<32)))
    662 #else
    663 # define LONG_LONG(a,b) \
    664 	((long long)((unsigned long long)(unsigned)(b) | ((unsigned long long)(a)<<32)))
    665 #endif
    666 extern int printllval(struct tcb *, const char *, int, bool);
    667 #define printllval_aligned(tcp, fmt, arg)	\
    668 	printllval((tcp), (fmt), (arg), true)
    669 #define printllval_unaligned(tcp, fmt, arg)	\
    670 	printllval((tcp), (fmt), (arg), false)
    671 
    672 extern void printxval(const struct xlat *, int, const char *);
    673 extern int printargs(struct tcb *);
    674 extern int printargs_lu(struct tcb *);
    675 extern int printargs_ld(struct tcb *);
    676 extern void addflags(const struct xlat *, int);
    677 extern int printflags(const struct xlat *, int, const char *);
    678 extern const char *sprintflags(const char *, const struct xlat *, int);
    679 extern void dumpiov(struct tcb *, int, long);
    680 extern void dumpstr(struct tcb *, long, int);
    681 extern void printstr(struct tcb *, long, long);
    682 extern void printnum(struct tcb *, long, const char *);
    683 extern void printnum_int(struct tcb *, long, const char *);
    684 extern void printpath(struct tcb *, long);
    685 extern void printpathn(struct tcb *, long, int);
    686 #define TIMESPEC_TEXT_BUFSIZE (sizeof(long)*3 * 2 + sizeof("{%u, %u}"))
    687 #define TIMEVAL_TEXT_BUFSIZE  TIMESPEC_TEXT_BUFSIZE
    688 extern void printtv_bitness(struct tcb *, long, enum bitness_t, int);
    689 #define printtv(tcp, addr)	\
    690 	printtv_bitness((tcp), (addr), BITNESS_CURRENT, 0)
    691 #define printtv_special(tcp, addr)	\
    692 	printtv_bitness((tcp), (addr), BITNESS_CURRENT, 1)
    693 extern char *sprinttv(char *, struct tcb *, long, enum bitness_t, int special);
    694 extern void print_timespec(struct tcb *, long);
    695 extern void sprint_timespec(char *, struct tcb *, long);
    696 #ifdef HAVE_SIGINFO_T
    697 extern void printsiginfo(siginfo_t *, int);
    698 extern void printsiginfo_at(struct tcb *tcp, long addr);
    699 #endif
    700 extern void printfd(struct tcb *, int);
    701 extern void print_dirfd(struct tcb *, int);
    702 extern void printsock(struct tcb *, long, int);
    703 extern void print_sock_optmgmt(struct tcb *, long, int);
    704 extern void printrusage(struct tcb *, long);
    705 #ifdef ALPHA
    706 extern void printrusage32(struct tcb *, long);
    707 #endif
    708 extern void printuid(const char *, unsigned long);
    709 extern void print_sigset_addr_len(struct tcb *, long, long);
    710 extern void printsignal(int);
    711 extern void tprint_iov(struct tcb *, unsigned long, unsigned long, int decode_iov);
    712 extern void tprint_iov_upto(struct tcb *, unsigned long, unsigned long, int decode_iov, unsigned long);
    713 extern void tprint_open_modes(mode_t);
    714 extern const char *sprint_open_modes(mode_t);
    715 extern void print_loff_t(struct tcb *, long);
    716 
    717 extern const struct_ioctlent *ioctl_lookup(long);
    718 extern const struct_ioctlent *ioctl_next_match(const struct_ioctlent *);
    719 extern int ioctl_decode(struct tcb *, long, long);
    720 extern int term_ioctl(struct tcb *, long, long);
    721 extern int sock_ioctl(struct tcb *, long, long);
    722 extern int proc_ioctl(struct tcb *, int, int);
    723 extern int rtc_ioctl(struct tcb *, long, long);
    724 extern int scsi_ioctl(struct tcb *, long, long);
    725 extern int block_ioctl(struct tcb *, long, long);
    726 extern int mtd_ioctl(struct tcb *, long, long);
    727 extern int ubi_ioctl(struct tcb *, long, long);
    728 extern int loop_ioctl(struct tcb *, long, long);
    729 extern int ptp_ioctl(struct tcb *, long, long);
    730 
    731 extern int tv_nz(const struct timeval *);
    732 extern int tv_cmp(const struct timeval *, const struct timeval *);
    733 extern double tv_float(const struct timeval *);
    734 extern void tv_add(struct timeval *, const struct timeval *, const struct timeval *);
    735 extern void tv_sub(struct timeval *, const struct timeval *, const struct timeval *);
    736 extern void tv_mul(struct timeval *, const struct timeval *, int);
    737 extern void tv_div(struct timeval *, const struct timeval *, int);
    738 
    739 #ifdef USE_LIBUNWIND
    740 extern void unwind_init(void);
    741 extern void unwind_tcb_init(struct tcb *tcp);
    742 extern void unwind_tcb_fin(struct tcb *tcp);
    743 extern void unwind_cache_invalidate(struct tcb* tcp);
    744 extern void unwind_print_stacktrace(struct tcb* tcp);
    745 extern void unwind_capture_stacktrace(struct tcb* tcp);
    746 #endif
    747 
    748 /* Strace log generation machinery.
    749  *
    750  * printing_tcp: tcb which has incomplete line being printed right now.
    751  * NULL if last line has been completed ('\n'-terminated).
    752  * printleader(tcp) examines it, finishes incomplete line if needed,
    753  * the sets it to tcp.
    754  * line_ended() clears printing_tcp and resets ->curcol = 0.
    755  * tcp->curcol == 0 check is also used to detect completeness
    756  * of last line, since in -ff mode just checking printing_tcp for NULL
    757  * is not enough.
    758  *
    759  * If you change this code, test log generation in both -f and -ff modes
    760  * using:
    761  * strace -oLOG -f[f] test/threaded_execve
    762  * strace -oLOG -f[f] test/sigkill_rain
    763  * strace -oLOG -f[f] -p "`pidof web_browser`"
    764  */
    765 extern struct tcb *printing_tcp;
    766 extern void printleader(struct tcb *);
    767 extern void line_ended(void);
    768 extern void tabto(void);
    769 extern void tprintf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
    770 extern void tprints(const char *str);
    771 
    772 #if SUPPORTED_PERSONALITIES > 1
    773 extern void set_personality(int personality);
    774 extern unsigned current_personality;
    775 #else
    776 # define set_personality(personality) ((void)0)
    777 # define current_personality 0
    778 #endif
    779 
    780 #if SUPPORTED_PERSONALITIES == 1
    781 # define current_wordsize PERSONALITY0_WORDSIZE
    782 #else
    783 # if SUPPORTED_PERSONALITIES == 2 && PERSONALITY0_WORDSIZE == PERSONALITY1_WORDSIZE
    784 #  define current_wordsize PERSONALITY0_WORDSIZE
    785 # else
    786 extern unsigned current_wordsize;
    787 # endif
    788 #endif
    789 
    790 /* In many, many places we play fast and loose and use
    791  * tprintf("%d", (int) tcp->u_arg[N]) to print fds, pids etc.
    792  * We probably need to use widen_to_long() instead:
    793  */
    794 #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
    795 # define widen_to_long(v) (current_wordsize == 4 ? (long)(int32_t)(v) : (long)(v))
    796 #else
    797 # define widen_to_long(v) ((long)(v))
    798 #endif
    799 
    800 extern const struct_sysent sysent0[];
    801 extern const char *const errnoent0[];
    802 extern const char *const signalent0[];
    803 extern const struct_ioctlent ioctlent0[];
    804 extern qualbits_t *qual_vec[SUPPORTED_PERSONALITIES];
    805 #define qual_flags (qual_vec[current_personality])
    806 #if SUPPORTED_PERSONALITIES > 1
    807 extern const struct_sysent *sysent;
    808 extern const char *const *errnoent;
    809 extern const char *const *signalent;
    810 extern const struct_ioctlent *ioctlent;
    811 #else
    812 # define sysent     sysent0
    813 # define errnoent   errnoent0
    814 # define signalent  signalent0
    815 # define ioctlent   ioctlent0
    816 #endif
    817 extern unsigned nsyscalls;
    818 extern unsigned nerrnos;
    819 extern unsigned nsignals;
    820 extern unsigned nioctlents;
    821 extern unsigned num_quals;
    822 
    823 /*
    824  * If you need non-NULL sysent[scno].sys_func and sysent[scno].sys_name
    825  */
    826 #define SCNO_IS_VALID(scno) \
    827 	((unsigned long)(scno) < nsyscalls && sysent[scno].sys_func)
    828 
    829 /* Only ensures that sysent[scno] isn't out of range */
    830 #define SCNO_IN_RANGE(scno) \
    831 	((unsigned long)(scno) < nsyscalls)
    832