Demonstrations of statsnoop, the Linux eBPF/bcc version.


statsnoop traces the different stat() syscalls system-wide, and prints various
details. Example output:

# ./statsnoop 
PID    COMM               FD ERR PATH
31126  bash                0   0 .
31126  bash               -1   2 /usr/local/sbin/iconfig
31126  bash               -1   2 /usr/local/bin/iconfig
31126  bash               -1   2 /usr/sbin/iconfig
31126  bash               -1   2 /usr/bin/iconfig
31126  bash               -1   2 /sbin/iconfig
31126  bash               -1   2 /bin/iconfig
31126  bash               -1   2 /usr/games/iconfig
31126  bash               -1   2 /usr/local/games/iconfig
31126  bash               -1   2 /apps/python/bin/iconfig
31126  bash               -1   2 /mnt/src/llvm/build/bin/iconfig
8902   command-not-fou    -1   2 /usr/bin/Modules/Setup
8902   command-not-fou    -1   2 /usr/bin/lib/python3.4/os.py
8902   command-not-fou    -1   2 /usr/bin/lib/python3.4/os.pyc
8902   command-not-fou     0   0 /usr/lib/python3.4/os.py
8902   command-not-fou    -1   2 /usr/bin/pybuilddir.txt
8902   command-not-fou    -1   2 /usr/bin/lib/python3.4/lib-dynload
8902   command-not-fou     0   0 /usr/lib/python3.4/lib-dynload
8902   command-not-fou     0   0 /apps/python/lib/python2.7/site-packages
8902   command-not-fou     0   0 /apps/python/lib/python2.7/site-packages
8902   command-not-fou     0   0 /apps/python/lib/python2.7/site-packages
8902   command-not-fou     0   0 /usr/lib/python3.4/
8902   command-not-fou     0   0 /usr/lib/python3.4/
[...]

This output has caught me mistyping a command in another shell, "iconfig"
instead of "ifconfig". The first several lines show the bash shell searching
the $PATH, and failing to find it (ERR == 2 is file not found). Then, a
"command-not-found" program executes (the name is truncated to 16 characters
in the COMM field), which begins the process of searching for and suggesting
a package. ie, this:

# iconfig
No command 'iconfig' found, did you mean:
 Command 'vconfig' from package 'vlan' (main)
 Command 'fconfig' from package 'redboot-tools' (universe)
 Command 'mconfig' from package 'mono-devel' (main)
 Command 'iwconfig' from package 'wireless-tools' (main)
 Command 'zconfig' from package 'python-zconfig' (universe)
 Command 'ifconfig' from package 'net-tools' (main)
iconfig: command not found

statsnoop can be used for general debugging, to see what file information has
been requested, and whether those files exist. It can be used as a companion
to opensnoop, which shows what files were actually opened.


USAGE message:

# ./statsnoop -h
usage: statsnoop [-h] [-t] [-x] [-p PID]

Trace stat() syscalls

optional arguments:
  -h, --help         show this help message and exit
  -t, --timestamp    include timestamp on output
  -x, --failed       only show failed stats
  -p PID, --pid PID  trace this PID only

examples:
    ./statsnoop           # trace all stat() syscalls
    ./statsnoop -t        # include timestamps
    ./statsnoop -x        # only show failed stats
    ./statsnoop -p 181    # only trace PID 181
