blob: f457d30bfa095de68428b7bb5b5a7646cc88aa7f [file] [log] [blame]
The Android Open Source Project34d6eab2009-03-03 19:30:45 -08001/*
2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@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.
The Android Open Source Project34d6eab2009-03-03 19:30:45 -080028 */
29
30#ifdef HAVE_CONFIG_H
Elliott Hughesbb0c2d52014-01-07 17:34:14 -080031# include "config.h"
The Android Open Source Project34d6eab2009-03-03 19:30:45 -080032#endif
Elliott Hughes15fc6a22014-01-09 10:30:06 -080033
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
Elliott Hughesbb0c2d52014-01-07 17:34:14 -080047#include <features.h>
48#ifdef HAVE_STDBOOL_H
49# include <stdbool.h>
The Android Open Source Project34d6eab2009-03-03 19:30:45 -080050#endif
Elliott Hughesbb0c2d52014-01-07 17:34:14 -080051#include <stdint.h>
52#include <inttypes.h>
The Android Open Source Project34d6eab2009-03-03 19:30:45 -080053#include <sys/types.h>
Elliott Hughesbb0c2d52014-01-07 17:34:14 -080054#ifdef STDC_HEADERS
55# include <stddef.h>
56#endif
The Android Open Source Project34d6eab2009-03-03 19:30:45 -080057#include <unistd.h>
58#include <stdlib.h>
59#include <stdio.h>
Elliott Hughes15fc6a22014-01-09 10:30:06 -080060/* 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> */
The Android Open Source Project34d6eab2009-03-03 19:30:45 -080064#include <string.h>
Elliott Hughesbb0c2d52014-01-07 17:34:14 -080065#include <errno.h>
66#include <signal.h>
The Android Open Source Project34d6eab2009-03-03 19:30:45 -080067#include <time.h>
68#include <sys/time.h>
The Android Open Source Project34d6eab2009-03-03 19:30:45 -080069#include <sys/syscall.h>
Elliott Hughesbb0c2d52014-01-07 17:34:14 -080070
71#ifndef HAVE_STRERROR
72const 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
80extern char *stpcpy(char *dst, const char *src);
The Android Open Source Project34d6eab2009-03-03 19:30:45 -080081#endif
82
Elliott Hughesbb0c2d52014-01-07 17:34:14 -080083#if !defined __GNUC__
84# define __attribute__(x) /*nothing*/
The Android Open Source Project34d6eab2009-03-03 19:30:45 -080085#endif
Elliott Hughesbb0c2d52014-01-07 17:34:14 -080086
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
Elliott Hughes15fc6a22014-01-09 10:30:06 -080094/* 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
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800103/* 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 */
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800111#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!
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800122 * linux/<ARCH>/syscallent*.h:
123 * all have nargs <= 6 except mips o32 which has nargs <= 7.
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800124 */
125#ifndef MAX_ARGS
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800126# ifdef LINUX_MIPSO32
127# define MAX_ARGS 7
128# else
129# define MAX_ARGS 6
130# endif
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800131#endif
132/* default sorting method for call profiling */
133#ifndef DEFAULT_SORTBY
134# define DEFAULT_SORTBY "time"
135#endif
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800136/*
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
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800143/*
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
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800152
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800153#ifdef NEED_PTRACE_PROTOTYPE_WORKAROUND
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800154# define ptrace xptrace
155# include <sys/ptrace.h>
156# undef ptrace
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800157extern long ptrace(int, int, char *, long);
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800158#else
159# include <sys/ptrace.h>
160#endif
161
162#if defined(POWERPC)
163# include <asm/ptrace.h>
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800164#endif
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800165
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800166#if defined(TILE)
167# include <asm/ptrace.h> /* struct pt_regs */
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800168#endif
169
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800170#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
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800183#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
Jeff Brownf76f96e2012-03-02 16:23:23 -0800192
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800193#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
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800231#if !HAVE_DECL_PTRACE_PEEKUSER
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800232# define PTRACE_PEEKUSER PTRACE_PEEKUSR
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800233#endif
234#if !HAVE_DECL_PTRACE_POKEUSER
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800235# define PTRACE_POKEUSER PTRACE_POKEUSR
236#endif
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800237
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800238#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
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800246
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
285struct 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 (int)(sizeof(long))
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800374#endif
375
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800376#if defined(I386) || defined(X86_64)
377extern uint32_t *const i386_esp_ptr;
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800378#elif defined(IA64)
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800379extern bool ia64_ia32mode;
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800380#elif defined(SPARC) || defined(SPARC64)
381extern struct pt_regs sparc_regs;
382#elif defined(ARM)
383extern struct pt_regs arm_regs;
384#elif defined(TILE)
385extern struct pt_regs tile_regs;
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800386#elif defined(POWERPC)
387extern struct pt_regs ppc_regs;
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800388#endif
Jeff Brownf76f96e2012-03-02 16:23:23 -0800389
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800390typedef struct sysent {
391 unsigned nargs;
392 int sys_flags;
393 int (*sys_func)();
394 const char *sys_name;
395} struct_sysent;
396
397typedef struct ioctlent {
398 const char *doth;
399 const char *symbol;
400 unsigned long code;
401} struct_ioctlent;
402
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800403/* Trace Control Block */
404struct tcb {
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800405 int flags; /* See below for TCB_ values */
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800406 int pid; /* If 0, this tcb is free */
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800407 int qual_flg; /* qual_flags[scno] or DEFAULT_QUAL_FLAGS + RAW */
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800408 int u_error; /* Error code */
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800409 long scno; /* System call number */
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800410 long u_arg[MAX_ARGS]; /* System call arguments */
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800411#if defined(LINUX_MIPSN32) || defined(X32)
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800412 long long ext_arg[MAX_ARGS];
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800413 long long u_lrval; /* long long return value */
414#endif
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800415 long u_rval; /* Return value */
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800416#if SUPPORTED_PERSONALITIES > 1
417 int currpers; /* Personality at the time of scno update */
418#endif
Jeff Brownf76f96e2012-03-02 16:23:23 -0800419 int curcol; /* Output column for this process */
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800420 FILE *outf; /* Output file for this process */
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800421 const char *auxstr; /* Auxiliary info from syscall (see RVAL_STR) */
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800422 const struct_sysent *s_ent; /* sysent[scno] or dummy struct for bad scno */
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800423 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 */
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800426 /* Support for tracing forked processes: */
427 long inst[2]; /* Saved clone args (badly named) */
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800428};
429
430/* TCB flags */
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800431/* We have attached to this process, but did not see it stopping yet */
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800432#define TCB_STARTUP 0x01
433#define TCB_IGNORE_ONE_SIGSTOP 0x02 /* Next SIGSTOP is to be ignored */
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800434/*
435 * Are we in system call entry or in syscall exit?
436 *
437 * This bit is set after all syscall entry processing is done.
438 * Therefore, this bit will be set when next ptrace stop occurs,
439 * which should be syscall exit stop. Other stops which are possible
440 * directly after syscall entry (death, ptrace event stop)
441 * are simpler and handled without calling trace_syscall(), therefore
442 * the places where TCB_INSYSCALL can be set but we aren't in syscall stop
443 * are limited to trace(), this condition is never observed in trace_syscall()
444 * and below.
445 * The bit is cleared after all syscall exit processing is done.
446 * User-generated SIGTRAPs and post-execve SIGTRAP make it necessary
447 * to be very careful and NOT set TCB_INSYSCALL bit when they are encountered.
448 * TCB_WAITEXECVE bit is used for this purpose (see below).
449 *
450 * Use entering(tcp) / exiting(tcp) to check this bit to make code more readable.
Jeff Brownf76f96e2012-03-02 16:23:23 -0800451 */
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800452#define TCB_INSYSCALL 0x04
453#define TCB_ATTACHED 0x08 /* We attached to it already */
454#define TCB_BPTSET 0x10 /* "Breakpoint" set after fork(2) */
455#define TCB_REPRINT 0x20 /* We should reprint this syscall on exit */
456#define TCB_FILTERED 0x40 /* This system call has been filtered out */
457/*
458 * x86 does not need TCB_WAITEXECVE.
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800459 * It can detect post-execve SIGTRAP by looking at eax/rax.
460 * See "not a syscall entry (eax = %ld)\n" message.
461 *
462 * Note! On new kernels (about 2.5.46+), we use PTRACE_O_TRACEEXEC, which
463 * suppresses post-execve SIGTRAP. If you are adding a new arch which is
464 * only supported by newer kernels, you most likely don't need to define
465 * TCB_WAITEXECVE!
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800466 */
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800467#if defined(ALPHA) \
468 || defined(SPARC) || defined(SPARC64) \
469 || defined(POWERPC) \
470 || defined(IA64) \
471 || defined(HPPA) \
472 || defined(SH) || defined(SH64) \
473 || defined(S390) || defined(S390X) \
474 || defined(ARM) \
475 || defined(MIPS)
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800476/* This tracee has entered into execve syscall. Expect post-execve SIGTRAP
477 * to happen. (When it is detected, tracee is continued and this bit is cleared.)
478 */
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800479# define TCB_WAITEXECVE 0x80
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800480#endif
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800481
482/* qualifier flags */
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800483#define QUAL_TRACE 0x001 /* this system call should be traced */
484#define QUAL_ABBREV 0x002 /* abbreviate the structures of this syscall */
485#define QUAL_VERBOSE 0x004 /* decode the structures of this syscall */
486#define QUAL_RAW 0x008 /* print all args in hex for this syscall */
487#define QUAL_SIGNAL 0x010 /* report events with this signal */
488#define QUAL_READ 0x020 /* dump data read on this file descriptor */
489#define QUAL_WRITE 0x040 /* dump data written to this file descriptor */
490typedef uint8_t qualbits_t;
491#define UNDEFINED_SCNO 0x100 /* Used only in tcp->qual_flg */
492
493#define DEFAULT_QUAL_FLAGS (QUAL_TRACE | QUAL_ABBREV | QUAL_VERBOSE)
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800494
495#define entering(tcp) (!((tcp)->flags & TCB_INSYSCALL))
496#define exiting(tcp) ((tcp)->flags & TCB_INSYSCALL)
497#define syserror(tcp) ((tcp)->u_error != 0)
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800498#define verbose(tcp) ((tcp)->qual_flg & QUAL_VERBOSE)
499#define abbrev(tcp) ((tcp)->qual_flg & QUAL_ABBREV)
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800500#define filtered(tcp) ((tcp)->flags & TCB_FILTERED)
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800501
502struct xlat {
503 int val;
Jeff Brownf76f96e2012-03-02 16:23:23 -0800504 const char *str;
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800505};
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800506#define XLAT(x) { x, #x }
507#define XLAT_END { 0, NULL }
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800508
Jeff Brownf76f96e2012-03-02 16:23:23 -0800509extern const struct xlat open_mode_flags[];
510extern const struct xlat addrfams[];
511extern const struct xlat struct_user_offsets[];
512extern const struct xlat open_access_modes[];
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800513extern const struct xlat whence_codes[];
Jeff Brownf76f96e2012-03-02 16:23:23 -0800514
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800515/* Format of syscall return values */
516#define RVAL_DECIMAL 000 /* decimal format */
517#define RVAL_HEX 001 /* hex format */
518#define RVAL_OCTAL 002 /* octal format */
519#define RVAL_UDECIMAL 003 /* unsigned decimal format */
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800520#if defined(LINUX_MIPSN32) || defined(X32)
521# if 0 /* unused so far */
522# define RVAL_LDECIMAL 004 /* long decimal format */
523# define RVAL_LHEX 005 /* long hex format */
524# define RVAL_LOCTAL 006 /* long octal format */
525# endif
526# define RVAL_LUDECIMAL 007 /* long unsigned decimal format */
527#endif
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800528#define RVAL_MASK 007 /* mask for these values */
529
530#define RVAL_STR 010 /* Print `auxstr' field after return val */
531#define RVAL_NONE 020 /* Print nothing */
532
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800533#define TRACE_FILE 001 /* Trace file-related syscalls. */
534#define TRACE_IPC 002 /* Trace IPC-related syscalls. */
535#define TRACE_NETWORK 004 /* Trace network-related syscalls. */
536#define TRACE_PROCESS 010 /* Trace process-related syscalls. */
537#define TRACE_SIGNAL 020 /* Trace signal-related syscalls. */
Jeff Brownf76f96e2012-03-02 16:23:23 -0800538#define TRACE_DESC 040 /* Trace file descriptor-related syscalls. */
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800539#define TRACE_MEMORY 0100 /* Trace memory mapping-related syscalls. */
540#define SYSCALL_NEVER_FAILS 0200 /* Syscall is always successful. */
Jeff Brownf76f96e2012-03-02 16:23:23 -0800541
542typedef enum {
543 CFLAG_NONE = 0,
544 CFLAG_ONLY_STATS,
545 CFLAG_BOTH
546} cflag_t;
Jeff Brownf76f96e2012-03-02 16:23:23 -0800547extern cflag_t cflag;
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800548extern bool debug_flag;
549extern bool Tflag;
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800550extern bool iflag;
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800551extern unsigned int qflag;
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800552extern bool not_failing_only;
553extern bool show_fd_path;
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800554extern bool hide_log_until_execve;
555/* are we filtering traces based on paths? */
556extern const char **paths_selected;
557#define tracing_paths (paths_selected != NULL)
558extern bool need_fork_exec_workarounds;
559extern unsigned xflag;
560extern unsigned followfork;
561extern unsigned ptrace_setoptions;
562extern unsigned max_strlen;
563extern unsigned os_release;
564#undef KERNEL_VERSION
565#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800566
Jeff Brownf76f96e2012-03-02 16:23:23 -0800567enum bitness_t { BITNESS_CURRENT = 0, BITNESS_32 };
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800568
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800569void error_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
570void perror_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
571void error_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2)));
572void perror_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2)));
573void die_out_of_memory(void) __attribute__ ((noreturn));
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800574
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800575#if USE_CUSTOM_PRINTF
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800576/*
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800577 * See comment in vsprintf.c for allowed formats.
578 * Short version: %h[h]u, %zu, %tu are not allowed, use %[l[l]]u.
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800579 */
580int strace_vfprintf(FILE *fp, const char *fmt, va_list args);
581#else
582# define strace_vfprintf vfprintf
583#endif
Jeff Brownf76f96e2012-03-02 16:23:23 -0800584
585extern void set_sortby(const char *);
586extern void set_overhead(int);
587extern void qualify(const char *);
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800588extern void print_pc(struct tcb *);
Jeff Brownf76f96e2012-03-02 16:23:23 -0800589extern int trace_syscall(struct tcb *);
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800590extern void count_syscall(struct tcb *, struct timeval *);
591extern void call_summary(FILE *);
592
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800593#if defined(AVR32) \
594 || defined(I386) \
595 || defined(X86_64) || defined(X32) \
596 || defined(AARCH64) \
597 || defined(ARM) \
598 || defined(SPARC) || defined(SPARC64) \
599 || defined(TILE) \
600 || defined(OR1K) \
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800601 || defined(METAG) \
602 || defined(ARC) \
603 || defined(POWERPC)
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800604extern long get_regs_error;
605# define clear_regs() (get_regs_error = -1)
606extern void get_regs(pid_t pid);
607#else
608# define get_regs_error 0
609# define clear_regs() ((void)0)
610# define get_regs(pid) ((void)0)
611#endif
Jeff Brownf76f96e2012-03-02 16:23:23 -0800612extern int umoven(struct tcb *, long, int, char *);
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800613#define umove(pid, addr, objp) \
614 umoven((pid), (addr), sizeof(*(objp)), (char *) (objp))
Jeff Brownf76f96e2012-03-02 16:23:23 -0800615extern int umovestr(struct tcb *, long, int, char *);
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800616extern int upeek(int pid, long, long *);
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800617#if defined(SPARC) || defined(SPARC64) || defined(IA64) || defined(SH)
618extern long getrval2(struct tcb *);
619#endif
620/*
621 * On Linux, "setbpt" is a misnomer: we don't set a breakpoint
622 * (IOW: no poking in user's text segment),
623 * instead we change fork/vfork/clone into clone(CLONE_PTRACE).
624 * On newer kernels, we use PTRACE_O_TRACECLONE/TRACE[V]FORK instead.
625 */
626extern int setbpt(struct tcb *);
627extern int clearbpt(struct tcb *);
628
629extern const char *signame(int);
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800630extern void pathtrace_select(const char *);
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800631extern int pathtrace_match(struct tcb *);
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800632extern int getfdpath(struct tcb *, int, char *, unsigned);
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800633
634extern const char *xlookup(const struct xlat *, int);
635
636extern int string_to_uint(const char *str);
637extern int string_quote(const char *, char *, long, int);
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800638extern int next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_bits);
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800639
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800640/* a refers to the lower numbered u_arg,
641 * b refers to the higher numbered u_arg
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800642 */
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800643#if HAVE_LITTLE_ENDIAN_LONG_LONG
644# define LONG_LONG(a,b) \
645 ((long long)((unsigned long long)(unsigned)(a) | ((unsigned long long)(b)<<32)))
646#else
647# define LONG_LONG(a,b) \
648 ((long long)((unsigned long long)(unsigned)(b) | ((unsigned long long)(a)<<32)))
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800649#endif
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800650extern int printllval(struct tcb *, const char *, int);
651
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800652extern void printxval(const struct xlat *, int, const char *);
653extern int printargs(struct tcb *);
654extern int printargs_lu(struct tcb *);
655extern int printargs_ld(struct tcb *);
656extern void addflags(const struct xlat *, int);
657extern int printflags(const struct xlat *, int, const char *);
658extern const char *sprintflags(const char *, const struct xlat *, int);
Jeff Brownf76f96e2012-03-02 16:23:23 -0800659extern void dumpiov(struct tcb *, int, long);
660extern void dumpstr(struct tcb *, long, int);
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800661extern void printstr(struct tcb *, long, long);
Jeff Brownf76f96e2012-03-02 16:23:23 -0800662extern void printnum(struct tcb *, long, const char *);
663extern void printnum_int(struct tcb *, long, const char *);
664extern void printpath(struct tcb *, long);
665extern void printpathn(struct tcb *, long, int);
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800666#define TIMESPEC_TEXT_BUFSIZE (sizeof(long)*3 * 2 + sizeof("{%u, %u}"))
667#define TIMEVAL_TEXT_BUFSIZE TIMESPEC_TEXT_BUFSIZE
Jeff Brownf76f96e2012-03-02 16:23:23 -0800668extern void printtv_bitness(struct tcb *, long, enum bitness_t, int);
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800669#define printtv(tcp, addr) \
670 printtv_bitness((tcp), (addr), BITNESS_CURRENT, 0)
671#define printtv_special(tcp, addr) \
672 printtv_bitness((tcp), (addr), BITNESS_CURRENT, 1)
673extern char *sprinttv(char *, struct tcb *, long, enum bitness_t, int special);
Jeff Brownf76f96e2012-03-02 16:23:23 -0800674extern void print_timespec(struct tcb *, long);
675extern void sprint_timespec(char *, struct tcb *, long);
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800676#ifdef HAVE_SIGINFO_T
Jeff Brownf76f96e2012-03-02 16:23:23 -0800677extern void printsiginfo(siginfo_t *, int);
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800678extern void printsiginfo_at(struct tcb *tcp, long addr);
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800679#endif
Jeff Brownf76f96e2012-03-02 16:23:23 -0800680extern void printfd(struct tcb *, int);
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800681extern void print_dirfd(struct tcb *, int);
Jeff Brownf76f96e2012-03-02 16:23:23 -0800682extern void printsock(struct tcb *, long, int);
683extern void print_sock_optmgmt(struct tcb *, long, int);
684extern void printrusage(struct tcb *, long);
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800685#ifdef ALPHA
686extern void printrusage32(struct tcb *, long);
687#endif
Jeff Brownf76f96e2012-03-02 16:23:23 -0800688extern void printuid(const char *, unsigned long);
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800689extern void print_sigset_addr_len(struct tcb *, long, long);
Jeff Brownf76f96e2012-03-02 16:23:23 -0800690extern void printsignal(int);
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800691extern void tprint_iov(struct tcb *, unsigned long, unsigned long, int decode_iov);
692extern void tprint_iov_upto(struct tcb *, unsigned long, unsigned long, int decode_iov, unsigned long);
Jeff Brownf76f96e2012-03-02 16:23:23 -0800693extern void tprint_open_modes(mode_t);
694extern const char *sprint_open_modes(mode_t);
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800695extern void print_loff_t(struct tcb *, long);
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800696
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800697extern const struct_ioctlent *ioctl_lookup(long);
698extern const struct_ioctlent *ioctl_next_match(const struct_ioctlent *);
Jeff Brownf76f96e2012-03-02 16:23:23 -0800699extern int ioctl_decode(struct tcb *, long, long);
700extern int term_ioctl(struct tcb *, long, long);
701extern int sock_ioctl(struct tcb *, long, long);
702extern int proc_ioctl(struct tcb *, int, int);
Jeff Brownf76f96e2012-03-02 16:23:23 -0800703extern int rtc_ioctl(struct tcb *, long, long);
704extern int scsi_ioctl(struct tcb *, long, long);
705extern int block_ioctl(struct tcb *, long, long);
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800706extern int mtd_ioctl(struct tcb *, long, long);
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800707extern int ubi_ioctl(struct tcb *, long, long);
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800708extern int loop_ioctl(struct tcb *, long, long);
Elliott Hughes5dec78d2014-02-26 15:56:23 -0800709extern int ptp_ioctl(struct tcb *, long, long);
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800710
Jeff Brownf76f96e2012-03-02 16:23:23 -0800711extern int tv_nz(struct timeval *);
712extern int tv_cmp(struct timeval *, struct timeval *);
713extern double tv_float(struct timeval *);
714extern void tv_add(struct timeval *, struct timeval *, struct timeval *);
715extern void tv_sub(struct timeval *, struct timeval *, struct timeval *);
716extern void tv_mul(struct timeval *, struct timeval *, int);
717extern void tv_div(struct timeval *, struct timeval *, int);
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800718
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800719/* Strace log generation machinery.
720 *
721 * printing_tcp: tcb which has incomplete line being printed right now.
722 * NULL if last line has been completed ('\n'-terminated).
723 * printleader(tcp) examines it, finishes incomplete line if needed,
724 * the sets it to tcp.
725 * line_ended() clears printing_tcp and resets ->curcol = 0.
726 * tcp->curcol == 0 check is also used to detect completeness
727 * of last line, since in -ff mode just checking printing_tcp for NULL
728 * is not enough.
729 *
730 * If you change this code, test log generation in both -f and -ff modes
731 * using:
732 * strace -oLOG -f[f] test/threaded_execve
733 * strace -oLOG -f[f] test/sigkill_rain
734 * strace -oLOG -f[f] -p "`pidof web_browser`"
735 */
736extern struct tcb *printing_tcp;
737extern void printleader(struct tcb *);
738extern void line_ended(void);
739extern void tabto(void);
740extern void tprintf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
741extern void tprints(const char *str);
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800742
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800743#if SUPPORTED_PERSONALITIES > 1
744extern void set_personality(int personality);
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800745extern unsigned current_personality;
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800746#else
747# define set_personality(personality) ((void)0)
748# define current_personality 0
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800749#endif
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800750
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800751#if SUPPORTED_PERSONALITIES == 1
752# define current_wordsize PERSONALITY0_WORDSIZE
753#else
754# if SUPPORTED_PERSONALITIES == 2 && PERSONALITY0_WORDSIZE == PERSONALITY1_WORDSIZE
755# define current_wordsize PERSONALITY0_WORDSIZE
756# else
757extern unsigned current_wordsize;
758# endif
759#endif
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800760
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800761/* In many, many places we play fast and loose and use
762 * tprintf("%d", (int) tcp->u_arg[N]) to print fds, pids etc.
763 * We probably need to use widen_to_long() instead:
764 */
765#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
766# define widen_to_long(v) (current_wordsize == 4 ? (long)(int32_t)(v) : (long)(v))
767#else
768# define widen_to_long(v) ((long)(v))
769#endif
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800770
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800771extern const struct_sysent sysent0[];
772extern const char *const errnoent0[];
773extern const char *const signalent0[];
774extern const struct_ioctlent ioctlent0[];
775extern qualbits_t *qual_vec[SUPPORTED_PERSONALITIES];
776#define qual_flags (qual_vec[current_personality])
777#if SUPPORTED_PERSONALITIES > 1
778extern const struct_sysent *sysent;
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800779extern const char *const *errnoent;
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800780extern const char *const *signalent;
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800781extern const struct_ioctlent *ioctlent;
782#else
783# define sysent sysent0
784# define errnoent errnoent0
785# define signalent signalent0
786# define ioctlent ioctlent0
787#endif
788extern unsigned nsyscalls;
789extern unsigned nerrnos;
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800790extern unsigned nsignals;
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800791extern unsigned nioctlents;
792extern unsigned num_quals;
The Android Open Source Project34d6eab2009-03-03 19:30:45 -0800793
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800794/*
795 * If you need non-NULL sysent[scno].sys_func and sysent[scno].sys_name
796 */
797#define SCNO_IS_VALID(scno) \
798 ((unsigned long)(scno) < nsyscalls && sysent[scno].sys_func)
799
800/* Only ensures that sysent[scno] isn't out of range */
Elliott Hughesbb0c2d52014-01-07 17:34:14 -0800801#define SCNO_IN_RANGE(scno) \
Elliott Hughes15fc6a22014-01-09 10:30:06 -0800802 ((unsigned long)(scno) < nsyscalls)