The patch is below:
# diff -u statsnoop statsnoop.FreeBSD --- statsnoop 2015-11-12 05:11:04.000000000 -0500 +++ statsnoop.FreeBSD 2015-12-03 00:38:45.089471021 -0500 @@ -191,9 +191,9 @@ /* * Print stat event */ - syscall::stat:entry, syscall::stat64:entry, syscall::xstat:entry, - syscall::lstat:entry, syscall::lstat64:entry, syscall::lxstat:entry, - syscall::fstat:entry, syscall::fstat64:entry, syscall::fxstat:entry + syscall::stat:entry, + syscall::lstat:entry, + syscall::fstat:entry { /* default is to trace unless filtering */ self->ok = FILTER ? 0 : 1; @@ -204,34 +204,29 @@ (OPT_trace == 1 && TRACE == probefunc) ? self->ok = 1 : 1; } - syscall::stat:entry, syscall::stat64:entry, - syscall::lstat:entry, syscall::lstat64:entry, syscall::lxstat:entry + syscall::stat:entry, + syscall::lstat:entry /self->ok/ { self->pathp = arg0; } - syscall::xstat:entry - /self->ok/ - { - self->pathp = arg1; - } - - syscall::stat:return, syscall::stat64:return, syscall::xstat:return, - syscall::lstat:return, syscall::lstat64:return, syscall::lxstat:return + syscall::stat:return, + syscall::lstat:return /self->ok/ { self->path = copyinstr(self->pathp); self->pathp = 0; } - syscall::fstat:return, syscall::fstat64:entry, syscall::fxstat:entry +/* + syscall::fstat:return /self->ok/ { self->filep = curthread->t_procp->p_user.u_finfo.fi_list[arg0].uf_file; } - syscall::fstat:return, syscall::fstat64:return, syscall::fxstat:return + syscall::fstat:return /self->ok/ { this->vnodep = self->filep != 0 ? self->filep->f_vnode : 0; @@ -239,10 +234,11 @@ cleanpath(this->vnodep->v_path) : "") : " "; self->filep = 0; } +*/ - syscall::stat:return, syscall::stat64:return, syscall::xstat:return, - syscall::lstat:return, syscall::lstat64:return, syscall::lxstat:return, - syscall::fstat:return, syscall::fstat64:return, syscall::fxstat:return + syscall::stat:return, + syscall::lstat:return, + syscall::fstat:return /self->ok && (! OPT_failonly || (int)arg0 < 0) && ((OPT_file == 0) || (OPT_file == 1 && PATHNAME == copyinstr(self->pathp)))/ { @@ -275,9 +271,9 @@ /* * Cleanup */ - syscall::stat:return, syscall::stat64:return, syscall::xstat:return, - syscall::lstat:return, syscall::lstat64:return, syscall::lxstat:return, - syscall::fstat:return, syscall::fstat64:return, syscall::fxstat:return + syscall::stat:return, + syscall::lstat:return, + syscall::fstat:return /self->ok/ { self->path = 0;
And voila, I'm able to watch all the stat(2) calls in real time. Sample of the output, with warnings removed:
# ./statsnoop.FreeBSD 2>&1 | grep -v 'invalid address' UID PID COMM FD PATH 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 1001 1373 konsole 0 /etc/nsswitch.conf 0 1074 sh -1 /var/tmp/appcafe/dispatch-queue 0 10683 sleep 0 /etc 0 10683 sleep 0 /etc/libmap.conf 0 10683 sleep 0 /usr 0 10683 sleep 0 /usr/local 0 10683 sleep 0 /usr/local/etc 0 10683 sleep -1 /usr/local/etc/libmap.dFor some reason, konsole loves to make sure that /etc/nsswitch.conf has not changed, and calls stat() constantly. Sounds like a job for stated(8) to solve, someday..