#compdef strace # TODO: # - make _sys_calls system-dependent # - allow negated calls (e.g. -e!write) _sys_calls () { local expl sys_calls=(_llseek _newselect _sysctl accept access acct adjtimex afs_syscall alarm bdflush bind break brk cacheflush capget capset chdir chmod chown chown32 chroot clone close connect creat create_module delete_module dup dup2 execve exit fchdir fchmod fchown fchown32 fcntl fcntl64 fdatasync flock fork fstat fstat64 fstatfs fsync ftime ftruncate ftruncate64 get_kernel_syms getcwd getdents getdents64 getegid getegid32 geteuid geteuid32 getgid getgid32 getgroups getgroups32 getitimer getpagesize getpeername getpmsg getpgid getpgrp getpid getppid getpriority getresgid getresgid32 getresuid getresuid32 getrlimit getrusage getsid getsockname getsockopt gettid gettimeofday getuid getuid32 gtty idle init_module ioctl ioperm iopl ipc kill lchown lchown32 link listen lock lseek lstat lstat64 madvise mincore mkdir mknod mlock mlockall mmap modify_ldt mount mprotect mpx mremap msync munlock munlockall munmap nanosleep nfsservctl nice oldfstat oldlstat oldolduname oldstat oldumount olduname open pause personality phys pipe pivot_root poll prctl pread prof profil ptrace putpmsg pwrite query_module quotactl read readahead readdir readlink readv reboot recv recvfrom recvmsg rename rmdir rt_sigaction rt_sigpending rt_sigprocmask rt_sigqueueinfo rt_sigreturn rt_sigsuspend rt_sigtimedwait sched_get_priority_max sched_get_priority_min sched_getparam sched_getscheduler sched_rr_get_interval sched_setparam sched_setscheduler sched_yield security select sendfile send sendmsg sendto setdomainname setfsgid setfsgid32 setfsuid setfsuid32 setgid setgid32 setgroups setgroups32 sethostname setitimer setpgid setpriority setregid setregid32 setresgid setresgid32 setresuid setresuid32 setreuid setreuid32 setrlimit setsid setsockopt settimeofday setuid setuid32 setup sgetmask shutdown sigaction sigaltstack signal sigpending sigprocmask sigreturn sigsuspend socket socketcall socketpair ssetmask stat stat64 statfs stime stty swapoff swapon symlink sync sysfs sysinfo syslog time times truncate truncate64 ulimit umask umount uname unlink uselib ustat utime vfork vhangup vm86 vm86old wait4 waitpid write writev) for t in ${(s:,:)${PREFIX}}; do sys_calls=( ${sys_calls:#$t} ) done compset -P '*,' _wanted sys_calls expl 'System calls' compadd -qS , -a sys_calls } _sets () { _alternative \ 'special:special values:(all none)' \ 'calls::_sys_calls' } _traces () { local expl traces=('file:trace all system calls which take a file name as an argument' 'process:trace all system calls which involve process management' 'network:trace all the network related system calls' 'signal:trace all signal related system calls' 'ipc:trace all IPC related system calls' 'desc:trace all file descriptor related system calls') compset -P '*,' _describe -t traces 'Related system calls' traces -qS , } _traces_sets () { _alternative \ 'traces::_traces' \ 'sets::_sets' } _expression () { _values -S = "Qualifying expression" \ 'trace[trace specified set of system calls only]:system calls:_traces_sets' \ 'abbrev[abbreviate the output from printing each member of large structures]:system calls:_sets' \ 'verbose[dereference structures for the specified set of system calls]:system calls:_sets' \ 'raw[print raw, undecoded arguments for the specified set of system calls]:system calls:_sets' \ 'signal[trace only the specified subset of signals]:signal:{compset -P "*,"; _signals -s -qS ,}' \ 'read[perform a full hex and ASCII dump of all the data read from listed file descriptors]:file descriptors:{compset -P "*,"; _file_descriptors -qS ,}' \ 'write[perform a full hex and ASCII dump of all the data written to listed file descriptors]:file descriptors:{compset -P "*,"; _file_descriptors -qS ,}' if [[ -z "$words[CURRENT]" || -n "${words[CURRENT]:#*=*}" ]]; then _traces_sets fi } _arguments \ '()-c[count time, calls, and errors for each system call and report a summary]' \ '()-C[count time, calls, and errors for each system call and report a summary in addition to regular output]' \ '-d[show some debugging output of strace itself on the standard error]' \ '-D[run tracer as detached grandchild, keeping traced process as direct child of calling process]' \ '-f[trace child processes as they are created by currently traced processes]' \ '-ff[write each process trace to . (when using -o ]' \ '(-c -d -f -ff -i -q -r -t -tt -ttt -T -v -V -x -xx -a -e -o -O -p -s -S -u -E)-h[print help]' \ '-i[print the instruction pointer at the time of the system call]' \ '-q[suppress messages about attaching, detaching etc.]' \ '-r[print a relative timestamp upon entry to each system call]' \ '(-ttt)-t[prefix each line of the trace with the time of day]' \ '(-ttt -tt)-tt[prefix each line of the trace with the time of day including the microseconds]' \ '(-tt -t)-ttt[prefix each line of the trace with the number of seconds and microseconds since the epoch]' \ '-T[show the time spent in system calls]' \ '-y[print paths associated with file descriptor arguments]' \ '-v[print unabbreviated versions of environment, stat, termios, etc. calls]' \ '(-c -d -f -ff -h -i -q -r -t -tt -ttt -T -v -x -xx -a -e -o -O -p -s -S -u -E)-V[print the version number of strace]' \ '(-xx)-x[print all non-ASCII strings in hexadecimal string format]' \ '(-x)-xx[print all strings in hexadecimal string format]' \ '-I+[when strace can be interrupted by signals]:interruptible:((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 are always blocked"))' \ '*-P+[trace only system calls accessing given path]:path:_files' \ '-a+[align return values in a specific column (default 40)]:column number' \ '*-e+[select events to trace or how to trace]:system call:_expression' \ '-o+[write the trace output to the file]:output file:_files' \ '-O+[overhead for tracing system calls]:overhead microseconds' \ '(:)-p+[attach to the process with specified process ID and begin tracing]:process ID:_pids' \ '-s+[specify the maximum string size to print (default 32)]:maximum string size' \ '-S+[sort the output of the histogram (-c option) by the specified criterion]:sort by:(time calls name nothing)' \ '-u+[run as specified user]:user:_users' \ '*-E+[remove variable from the inherited list of environment or define a value]:variable:_printenv' \ '(-):command name: _command_names -e' \ '*::arguments:_normal'