mirror of
https://github.com/zsh-users/zsh
synced 2024-09-30 05:06:09 +00:00
173 lines
12 KiB
Plaintext
173 lines
12 KiB
Plaintext
#compdef strace strace64
|
|
|
|
local curcontext="$curcontext" root
|
|
local -i prec=1 form=1 ret=1
|
|
local -a state line expl alts suf
|
|
typeset -A opt_args
|
|
|
|
(( EUID && ! $+_comp_priv_prefix )) && root='!'
|
|
|
|
_arguments -C -s \
|
|
\*{-E+,--env=}'[set or remove exported environment variable]:variable:->envars' \
|
|
'(:)*'{-p+,--attach=}'[attach to the process with specified process ID and begin tracing]:process ID:_pids' \
|
|
"${root}(-u --user)"{-u+,--user=}'[run as specified user]:user:_users' \
|
|
'--argv0=[set argv0 for program]:name' \
|
|
'(-b --detach-on)'{-b+,--detach-on=}'[detach from process on specified syscall]:syscall:(execve)' \
|
|
'(--daemonize)-D[run tracer as detached grandchild, keeping traced process as direct child of calling process]' \
|
|
'(-D)--daemonize=-[specify how to run tracer process]::method:(grandchild pgroup session)' \
|
|
'(-f --follow-forks)'{-f,--follow-forks}'[trace child processes as they are created by currently traced processes]' \
|
|
'(-I --interruptible)'{-I+,--interruptible=}'[specify 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 with -o)" 4\:"fatal signals and SIGTSTP are always blocked"))' \
|
|
'--kill-on-exit[kill all tracees if strace is killed]' \
|
|
\*{-e+,--trace=}'[select events to trace or how to trace]:system call:->expressions' \
|
|
\*{-P+,--path=}'[trace only system calls accessing given path]:path:_files' \
|
|
'(-z -Z --successful-only --failed-only)'{-z,--successful-only}'[trace only system calls that return success]' \
|
|
'(-z -Z --successful-only --failed-only)'{-Z,--failed-only}'[trace only system calls that return an error]' \
|
|
'(-a --columns)'{-a+,--columns=}'[align return values in a specific column]:column number [40]' \
|
|
'(-i --instruction-pointer -c --summary-only)'{-i,--instruction-pointer}'[print instruction pointer at time of syscall]' \
|
|
'(-c --summary-only -k --stack-traces)'{-k,--stack-traces}'[obtain stack trace between each syscall]' \
|
|
'(-n --syscall-number)'{-n,--syscall-number}'[print syscall number]' \
|
|
'(-o --output)'{-o+,--output=}'[send trace output to the specified file]:output file:->file-pipe' \
|
|
'(-A --output-append-mode)'{-A,--output-append-mode}'[open the file provided with the -o option in append mode]' \
|
|
'--output-separately[output to separate files for child processes (by appending pid to file names)]' \
|
|
'(--quiet)-q[suppress messages about attaching, detaching etc]' \
|
|
'(-q --quiet)-qq[suppress messages about process exit status]' \
|
|
'(-q -qq --quiet)-qqq[suppress all suppressible messages]' \
|
|
'(-q -qq -qqq)--quiet=[suppress messages about attaching, detaching etc]:suppression:_sequence compadd - attach personality exit all' \
|
|
'(--relative-timestamps -c --summary-only)-r[print a relative timestamp upon entry to each system call]' \
|
|
'(-r -c --summary-only)--relative-timestamps=-[print a relative timestamp upon entry to each system call]:precision [us]:compadd -o nosort s ms us ns' \
|
|
'(--absolute-timestamps)-t[prefix each line of the trace with the wall clock time]' \
|
|
'(-t)--absolute-timestamps=-[prefix each line of the trace with the wall clock time]:: :->time-formats' \
|
|
'!(-t --absolute-timestamps)--timestamps=-:: :->time-formats' \
|
|
'(-s --string-limit)'{-s+,--string-limit=}'[specify the maximum string size to print]:maximum string size [32]' \
|
|
'(-c --summary-only -ttt)-t[prefix each line of the trace with the time of day]' \
|
|
'(-c --summary-only -ttt -tt)-tt[prefix each line of the trace with the time of day including the microseconds]' \
|
|
'(-c --summary-only -tt -t)-ttt[prefix each line of the trace with the number of seconds and microseconds since the epoch]' \
|
|
'(--syscall-times -c --summary-only)-T[show the time spent in system calls]' \
|
|
'(-T -c --summary-only)--syscall-times=-[show the time spent in system calls]::precision [us]:compadd -o nosort s ms us ns' \
|
|
'(-v --no-abbrev)'{-v,--no-abbrev}'[print unabbreviated versions of environment, stat, termios, etc. calls]' \
|
|
'(-xx --strings-in-hex)-x[print all non-ASCII strings in hexadecimal string format]' \
|
|
'(-x --strings-in-hex)-xx[print all strings in hexadecimal string format]' \
|
|
'(-x -xx)--strings-in-hex=[specify strings to print in hexadecimal format]:string type:(all non-ascii non-ascii-chars)' \
|
|
'(-X --const-print-style)'{-X+,--const-print-style=}'[set the format for printing of named constants and flags]:format:(raw abbrev verbose)' \
|
|
'(-c --summary-only -yy --decode-fds)-y[print paths associated with file descriptor arguments]' \
|
|
'(-c --summary-only -y --decode-fds)-yy[print protocol specific information associated with socket file descriptors]' \
|
|
'(-c --summary-only -y -yy)--decode-fds=-[print information associated with file descriptors]::information [none]:_sequence compadd - none all path socket dev pidfd signalfd' \
|
|
'(-c --summary-only -Y)--decode-pids=[print information associated with process IDs]:information [none]:_sequence compadd - none comm pidns' \
|
|
'!(-c --summary-only -Y --decode-pids)--pidns-translation' \
|
|
'(-c --summary-only --decode-pids)-Y[print command names for PIDs]' \
|
|
'(-c --summary-only -C --summary -i --instruction-pointer -k --stack-traces -r --relative-timestamps -ff -t -tt -ttt --absolute-timestamps -T --syscall-times -y -yy --decode-fds)'{-c,--summary-only}'[count time, calls, and errors for each system call and report a summary]' \
|
|
'(-c --summary-only -C --summary)'{-C,--summary}'[count time, calls, and errors for each system call and report a summary in addition to regular output]' \
|
|
'(-O --summary-syscall-overhead)'{-O+,--summary-syscall-overhead=}'[specify overhead for tracing system calls]:overhead (microseconds)' \
|
|
'(-S --summary-sort-by)'{-S+,--summary-sort-by=}'[sort the output of the histogram (-c option) by the specified criterion]:sort criterion [time]:(time min-time max-time avg-time calls errors name nothing)' \
|
|
'(-U --summary-columns)'{-U+,--summary-columns=}'[show specific columns in the summary report]:column:_sequence compadd - time-percent total-time min-time max-time avg-time calls errors name' \
|
|
'(-w --summary-wall-clock)'{-w,--summary-wall-clock}'[summarise syscall latency]' \
|
|
'(-c --summary-only -C)-ff[write each process trace to <filename>.<pid> (when using -o <filename>]' \
|
|
'--syscall-limit=[detach all tracees after tracing given number of syscalls]:limit' \
|
|
'(-d --debug)'{-d,--debug}'[show debug output of strace itself on standard error]' \
|
|
'(- 1 *)'{-h,--help}'[display help information]' \
|
|
'--seccomp-bpf[enable seccomp-bpf filtering]' \
|
|
'--tips=-[show strace tips, tricks, and tweaks before exit]:tip [id\:random,format\:compact]' \
|
|
'(- 1 *)'{-V,--version}'[display version information]' \
|
|
'(-):command name: _command_names -e' \
|
|
'*::arguments:_normal' && ret=0
|
|
|
|
case $state in
|
|
expressions)
|
|
_values -C -S = 'qualifying expression' \
|
|
'trace[trace specified set of system calls only]:system calls:->syscalls' \
|
|
'abbrev[abbreviate the output from printing each member of large structures]:system call:_sequence _sys_calls -a -n' \
|
|
'verbose[dereference structures for the specified set of system calls]:system call:_sequence _sys_calls -a -n' \
|
|
'raw[print raw, undecoded arguments for the specified set of system calls]:system call:_sequence _sys_calls -a -n' \
|
|
'signal[trace only the specified subset of signals]:signal:_sequence _signals -s -M "B\:!="' \
|
|
'trace-fds[trace operations on listed file descriptors]:file descriptor:_sequence _file_descriptors' \
|
|
'read[perform a full hex and ASCII dump of all the data read from listed file descriptors]:file descriptor:_sequence _file_descriptors' \
|
|
'write[perform a full hex and ASCII dump of all the data written to listed file descriptors]:file descriptor:_sequence _file_descriptors' \
|
|
'fault[perform syscall fault injection]:system call:_sys_calls -a -n' \
|
|
'inject[perform syscall tampering]:system call:_sys_calls -a -n' \
|
|
'status[trace system calls with given return status]:status:->status' \
|
|
'quiet[suppress various information messages]:message [none]:_sequence compadd - none attach exit path-resolution personality thread-execve superseded' \
|
|
'kvm[print the exit reason of kvm vcpu]: :(vcpu)' \
|
|
'decode-fds[print information associated with file descriptors]:information [none]:_sequence compadd - none all path socket dev pidfd signalfd' \
|
|
'decode-pids[print information associated with process IDs]:information [none]:_sequence compadd - none comm pidns' && ret=0
|
|
if [[ $state = status ]]; then
|
|
_values -s , 'return status [all]' \
|
|
all successful failed \
|
|
"unfinished[system calls that don't return]" \
|
|
'unavailable[system calls that return but strace fails to fetch the error]' \
|
|
'detached[system calls where strace detaches before the return]' && ret=0
|
|
elif [[ $words[CURRENT] != *=* || $state = syscalls ]]; then
|
|
local dedup sets
|
|
compset -P '!'
|
|
dedup=( ${(Ms.,.)PREFIX##*,} ${(Ms.,.)SUFFIX%%,*} )
|
|
compset -S ',*' || suf=( "-qS," )
|
|
compset -P '*,'
|
|
if compset -P /; then
|
|
_wanted syscalls expl "system call (regex)" _sys_calls -a -n $suf -F dedup && ret=0
|
|
else
|
|
sets=(
|
|
'%clock:trace system calls that read or modify system clocks'
|
|
'%creds:trace system calls that read or modify user and group identifiers or capability sets'
|
|
{%,}'file:trace all system calls which take a file name as an argument'
|
|
{%,}'process:trace all system calls which involve process management'
|
|
{%net,{%,}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'
|
|
{%,}'memory:trace all memory mapping related system calls'
|
|
'%stat:trace variants of stat'
|
|
'%lstat:trace variants of lstat'
|
|
'%fstat:trace variants of fstat and fstatat'
|
|
'%%stat:trace variants of all syscalls used for requesting file status'
|
|
'%statfs:trace variants of statfs'
|
|
'%fstatfs:trace variants of fstatfs'
|
|
'%%statfs:trace variants of all syscalls used for file system statistics'
|
|
'%pure:trace syscalls that always succeed and have no arguments'
|
|
)
|
|
_alternative \
|
|
"sets:related system call: _describe -t traces 'related system call' sets -F dedup $suf" \
|
|
"syscalls:system call:_sys_calls -a -n $suf -F dedup" && ret=0
|
|
fi
|
|
fi
|
|
;;
|
|
file-pipe)
|
|
compset -P '\\'
|
|
if (( ! $+opt_args[-ff] )) && compset -P '(!|\|)'; then
|
|
compset -q
|
|
if (( CURRENT == 1 )); then
|
|
_command_names -e && ret=0
|
|
else
|
|
_normal && ret=0
|
|
fi
|
|
else
|
|
_files && ret=0
|
|
fi
|
|
;;
|
|
envars)
|
|
if [[ -prefix *=* ]]; then
|
|
compstate[parameter]="${PREFIX%%\=*}"
|
|
compset -P 1 '*='
|
|
_value && ret=0
|
|
else
|
|
_parameters -qS= -g "*export*" && ret=0
|
|
fi
|
|
;;
|
|
time-formats)
|
|
alts=()
|
|
compset -P '(precision:*|s|ms|us|ns),' && prec=0
|
|
compset -P '(format:*|none|time|unix),' && form=0
|
|
compset -S ',*' || (( !prec + !form )) || suf=( -S , )
|
|
if compset -P 'precision:'; then
|
|
form=0
|
|
elif compset -P 'format:'; then
|
|
prec=0
|
|
else
|
|
alts=( 'prefixes:prefix:compadd -S ":" ${${(s. .):-format x}[form]} ${${(s. .):-precision x}[prec]}' )
|
|
fi
|
|
(( prec )) && alts+=( 'precisions:precision [s]:compadd -o nosort $suf s ms us ns' )
|
|
(( form )) && alts+=( 'formats:format [time]:compadd $suf none time unix' )
|
|
_alternative $alts && ret=0
|
|
;;
|
|
esac
|
|
|
|
return ret
|