NAME
dwatch —
watch processes as they trigger a
particular DTrace probe
SYNOPSIS
dwatch |
[-1defFmnPqRvVwxy] [-B
num] [-E
code] [-g
group] [-j
jail] [-k
name] [-K
num] [-N
count] [-o
file] [-O
cmd] [-p
pid] [-r
regex] [-t
test] [-T
time] [-u
user] [-X
profile] [-z
regex] [--] [probe[,...]]
[args ...] |
dwatch |
-l [-fmnPqy]
[-r regex] [probe ...] |
dwatch |
-Q [-1qy]
[-r regex] |
DESCRIPTION
The dwatch utility uses
dtrace(1) to display process info when a given DTrace probe
point is triggered. Only the root user or users with
sudo(8) (ports/security/sudo) access
can run this command.
dwatch automates the process of generating
DTrace scripts to coalesce trace output by date/time, process info, and
[optionally] probe-specific data.
Output format without options is:
date/time uid.gid execname[pid]:
psargsFor example, the command ‘dwatch
BEGIN’ produces:
INFO Watching 'dtrace:::BEGIN'
...2017 May 29 08:23:20 0.0
dtrace[60671]: dtrace -s /dev/stdinThe -F option causes
dwatch to instead coalesce trace output by
date/time, process info, and probe traversal.
Output format with the
‘’ option
is:-F
date/time uid.gid execname[pid]:
{->,<-, |} prov:mod:func:name ...For example, the command ‘dwatch -F
BEGIN’ produces:
INFO Watching 'dtrace:::BEGIN'
...2017 May 29 21:34:41 0.0
dtrace[86593]: | dtrace:::BEGIN ...The -R option causes
dwatch to display a process tree containing the
parent, grandparent, and ancestor process info.
Output format with the
‘’ option
is:-R
date/time uid0.gid0 execname[pid0]:
psargs0 -+= pid3 uid3.gid3
psargs3 \-+= pid2 uid2.gid2
psargs2 \-+= pid1 uid1.gid1
psargs1 \-+= pid0 uid0.guid0
psargs0For example, the command ‘dwatch -R
BEGIN’ produces:
INFO Watching 'dtrace:::BEGIN'
...2017 May 29 21:38:54 0.0
dtrace[86899]: dtrace -s /dev/stdin -+= 86855 604.604 -bash \-+= 86857 604.604 /bin/sh
/usr/sbin/dwatch -R BEGIN \-+= 86897 0.0 sudo dtrace -s
/dev/stdin \-+= 86899 0.0 dtrace -s
/dev/stdinOf particular interest is the ability to filter using regular
expressions. The ‘’,
‘-g
group’,
‘-p
pid’,
‘-r
regex’, and
‘-u
user’ options can be combined with
‘-z
regex’ to match
on parent process criteria as well as current process info.-R
In contrast, the
‘’, and
‘-j
jail’ options apply only to the current
process even if
‘-k
name’ is
given.-R
The ‘’ option gives the ability to
customize probe-specific data. For example, the command:-E
code
dwatch -E 'printf("%s",
copyinstr(arg0))' chdirdisplays the path argument sent to chdir(2) calls.
Profiles can be written for more complex routines and/or
convenience. To list available profiles use the
‘’ option.
Use the ‘-Q’ option to use a particular
profile.-X
profile
For example, the command ‘dwatch -X
kill’ displays arguments sent to
kill(2).
OPTIONS
If a probe argument does not contain colon
(":") and none of
‘’,
‘-P’,
‘-m’, or
‘-f’ are
given, the probe argument is intelligently mapped to its most-likely value.
Use ‘-n’ to see
what probes will match a given name.dwatch
-l name
Multiple probes must be given as a single (quoted) argument, separated by comma and/or whitespace. Any/all arguments following said probes will be passed to dtrace(1) unmodified.
-1- Print one line per process/profile (Default; disables
‘
’).-R -Bnum- Maximum number of arguments to display (Default 64).
-d- Debug. Send dtrace(1) script to stdout instead of executing.
-e- Exit after compiling request but prior to enabling probes.
-Ecode- DTrace code for event details. If `-', read from stdin. This allows customization of what is printed after date/time and process info. By default, the name and arguments of the program triggering the probe are shown. Can be specified multiple times.
-f- Enable probes matching the specified function names.
-F- Coalesce trace output by probe.
-ggroup- Group filter. Only show processes matching group name/gid. This can be an awk(1) regular expression to match a numerical gid.
-jjail- Jail filter. Only show processes matching jail name/jid.
-kname- Only show processes matching name. Can also be of
the format
‘
’ to indicate “name*begins with”, ‘’ to indicate “*nameends with”, or ‘’ to indicate “*name*contains”. Can be specified multiple times. -Knum- Maximum directory depth to display (Default 64).
-l- List available probes on standard output and exit.
-m- Enable probes matching the specified module names.
-Xprofile- Load profile from DWATCH_PROFILES_PATH.
-n- Enable probes matching the specified probe names.
-Ncount- Exit after count matching entries (Default 0 for disabled).
-ofile- Set output file. If
‘
’, the path ‘-’ is used./dev/stdout -Ocmd- Execute cmd for each event. This can be any valid
sh(1) command. The environment variables
‘
’ and ‘$TAG’ are set for the given cmd.$DETAILS -ppid- Process id filter. Only show processes with matching pid. This can be an awk(1) regular expression.
-P- Enable probe matching the specified provider name.
-q- Quiet. Hide informational messages and all dtrace(1) errors.
-Q- List available profiles in DWATCH_PROFILES_PATH and exit.
-rregex- Filter. Only show blocks matching awk(1) regular expression.
-R- Show parent, grandparent, and ancestor of process.
-ttest- Test clause (predicate) to limit events (Default none). Can be specified multiple times.
-Ttime- Timeout. The format is
‘
’ or just ‘#[smhd]’ for seconds.# -uuser- User filter. Only show processes matching user name/uid. This can be an awk(1) regular expression to match a numerical UID.
-v- Verbose. Show all errors from dtrace(1).
-V- Report
dwatchversion on standard output and exit. -w- Permit destructive actions (copyout*, stop, panic, etc.).
-x- Trace. Print
‘
’ when a probe is triggered.<probe-id> -y- Always treat stdout as console (enable colors/columns/etc.).
-zregex- Only show processes matching awk(1) regular expression.
PROFILES
Profiles customize the data printed during events. Profiles are
loaded from a colon-separated list of directories in
DWATCH_PROFILES_PATH. This is an incomplete list of
profiles with basic descriptions:
- chmod
- Print mode and path from chmod(2), lchmod(2), fchmodat(2)
- errno
- Print non-zero errno results from system calls
- io
- Print disk I/O details provided by dtrace_io(4)
- ip
- Print IPv4 and IPv6 details provided by dtrace_ip(4)
- kill
- Print signal and pid from kill(2)
- nanosleep
- Print requested time from nanosleep(2)
- open
- Print path from open(2), openat(2)
- proc
- Print process execution details provided by dtrace_proc(4)
- proc-signal
- Print process signal details provided by dtrace_proc(4)
- rw
- Print buffer contents from read(2), write(2)
- sched
- Print CPU scheduling details provided by dtrace_sched(4)
- tcp
- Print TCP address/port details provided by dtrace_tcp(4)
- tcp-io
- Print TCP I/O details provided by dtrace_tcp(4)
- udp
- Print UDP I/O details provided by dtrace_udp(4)
- vop_create
- Print filesystem paths being created by VOP_CREATE(9)
- vop_lookup
- Print filesystem paths being looked-up by VOP_LOOKUP(9)
- vop_mkdir
- Print directory paths being created by VOP_MKDIR(9)
- vop_mknod
- Print device node paths being created by VOP_MKNOD(9)
- vop_readdir
- Print directory paths being read by VOP_READDIR(9)
- vop_remove
- Print filesystem paths being removed by VOP_REMOVE(9)
- vop_rename
- Print filesystem paths being renamed by VOP_RENAME(9)
- vop_rmdir
- Print directory paths being removed by VOP_RMDIR(9)
- vop_symlink
- Print symlink paths being created by VOP_SYMLINK(9)
ENVIRONMENT
These environment variables affect the execution of
dwatch:
DWATCH_PROFILES_PATH- If
DWATCH_PROFILES_PATHis set,dwatchsearches for profiles in the colon-separated list of directories in that variable instead of the default ‘’. If set to NULL, profiles are not loaded./usr/libexec/dwatch:/usr/local/libexec/dwatch
EXIT STATUS
The dwatch utility exits 0 on
success, and >0 if an error occurs.
EXAMPLES
Watch processes entering system CPU scheduler.
dwatch on-cpu
List available profiles, one line per profile.
dwatch -1 -Q
Do not execute dtrace(1) but display script on stdout and exit.
dwatch -d fsync
Compile and test but do not execute code generated with given probe.
dwatch -e test_probe
Print argument one being passed to each call of zfs_sync().
dwatch -E 'printf("%i", arg1)' zfs_sync
Watch all functions named
‘’.read
dwatch -f read
Watch all probe traversal.
dwatch -F :
Watch syscall probe traversal.
dwatch -F syscall
Display only processes belonging to wheel super-group.
dwatch -g wheel execve
Display only processes belonging to groups
‘’ or
‘daemon’.nobody
dwatch -g '1|65534' execve
Ignore jails, displaying only base system processes.
dwatch -j 0 execve
Display only processes running inside the jail named
‘’.myjail
dwatch -j myjail execve
Watch syscall traversal by ruby processes.
dwatch -k 'ruby*' -F syscall
Watch syscall traversal by processes containing
‘’ in
their name.daemon
dwatch -k '*daemon*' -F syscall
Watch signals being passed to kill(2).
dwatch -X kill
Watch signals being passed between bash(1) (ports/shells/bash) and vi(1).
dwatch -k bash -k vi -X kill
Display a list of unique functions available.
dwatch -l -f
List available probes for functions ending in
‘’.read
dwatch -l -f '*read'
List available probes ending in
“read”.
dwatch -l -r 'read$'
Display a list of unique providers.
dwatch -l -P
Watch paths being removed by VOP_REMOVE(9).
dwatch -X vop_remove
Watch the name
‘’ instead
of the function
‘read’. The
readdwatch selection algorithm will commonly favor the
function named
‘’ when
not given a type (using ‘read-P’,
‘-m’,
‘-f’, or
‘-n’) because there are more probes
matching the function named
‘’ than
probes matching
‘read’ for any
other type.read
dwatch -n read
Display the first process to call kill(2) and then exit.
dwatch -N 1 kill
Watch processes forked by pid 1234.
dwatch -p 1234 execve
Watch processes forked by either pid 1234 or pid 5678.
dwatch -p '1234|5678' execve
Watch the provider
‘’
instead of the function
‘random’. The
randomdwatch selection algorithm will commonly favor the
function named
‘’ when
not given a type (using ‘random-P’,
‘-m’,
‘-f’, or
‘-n’) because there are more probes
matching the function named
‘’ than
probes matching the provider named
‘random’.random
dwatch -P random
Display available profiles matching
‘’.vop
dwatch -Q -r vop
Watch
VOP_LOOKUP(9) paths containing
‘’./lib/
dwatch -r /lib/ -X vop_lookup
Show process tree for each command as it is executed.
dwatch -R execve
Watch processes forked by pid 1234 or children thereof.
dwatch -R -p 1234 execve
Display processes calling write(2) with “nbytes” less than 10.
dwatch -t 'arg2<10' -E 'printf("%d",arg2)' write
Display
write(2) buffer when “execname” is not
‘’ and
“nbytes” is less than 10.dtrace
dwatch -X write -t 'execname != "dtrace" && this->nbytes < 10'
Watch
‘’ for 5
minutes and exit.statfs
dwatch -T 5m statfs
Display only processes belonging to the root super-user.
dwatch -u root execve
Display only processes belonging to users
‘’ or
‘daemon’.nobody
dwatch -u '1|65534' execve
Print version and exit.
dwatch -V
View the first 100 scheduler preemptions.
dwatch -y -N 100 preempt | less -R
Display processes matching either
“mkdir” or
“rmdir”.
dwatch -z '(mk|rm)dir' execve
Run a command and watch network activity only while that command runs.
dwatch -X tcp -- -c "nc -zvw10 google.com 22"
Watch open(2) and openat(2) calls only while pid 1234 is active.
dwatch -X open -- -p 1234
Watch probe traversal for a given command. Note that
“-c true” is passed to
dtrace(1) since it appears after the
dwatch probe argument.
dwatch -F 'pid$target:::entry' -c true
SEE ALSO
HISTORY
dwatch first appeared in
FreeBSD 11.2.
AUTHORS
Devin Teske <dteske@FreeBSD.org>