diff options
Diffstat (limited to 'stap_tutorial-1.0/examples/cmd-eval/cmd-eval-rw.stp')
-rwxr-xr-x | stap_tutorial-1.0/examples/cmd-eval/cmd-eval-rw.stp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-rw.stp b/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-rw.stp new file mode 100755 index 0000000..f5107ff --- /dev/null +++ b/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-rw.stp @@ -0,0 +1,104 @@ +#!/usr/bin/env stap + +global target_pids, target_execs +global reads_by_file, reads_by_exec +global writes_by_file, writes_by_exec +global files, execs + +%{ +#include <linux/file.h> +%} + +function fd2name:string (fd:long) +%{ + char *start = NULL, buf[MAXSTRINGLEN]; + struct file *file = NULL; + struct vfsmount *mnt = NULL; + struct dentry *dentry = NULL; + + file = fget(THIS->fd); + if (file) { + mnt = (struct vfsmount *) kread(&(file->f_path.mnt)); + dentry = (struct dentry *) kread(&(file->f_path.dentry)); + if (mnt && dentry) + start = d_path(dentry, mnt, buf, MAXSTRINGLEN); + if (start > 0) + strlcpy(THIS->__retvalue, start, MAXSTRINGLEN); + fput(file); + } + CATCH_DEREF_FAULT(); +%} + +probe process.exec_complete { + if (success && (ppid() in target_pids || pid() == target())) { + target_pids[pid()] = kernel_string($filename) + target_execs[kernel_string($filename)] ++ + } +} + +probe syscall.read.return, syscall.readv.return { + if (!(pid() in target_pids)) next + + if ($return >= 0) { + fn = fd2name($fd) + exec = execname() + reads_by_file[fn] <<< $return + reads_by_exec[exec] <<< $return + files[fn] ++ + execs[exec] ++ + } +} + +probe syscall.write.return, syscall.writev.return { + if (!(pid() in target_pids)) next + + if ($return >= 0) { + fn = fd2name($fd) + exec = execname() + writes_by_file[fn] <<< $return + writes_by_exec[exec] <<< $return + files[fn] ++ + execs[exec] ++ + } +} + +probe end { + foreach (file in reads_by_file) { + total_read_cnt += @count(reads_by_file[file]) + total_read_bytes += @sum(reads_by_file[file]) + } + + foreach (file in writes_by_file) { + total_write_cnt += @count(writes_by_file[file]) + total_write_bytes += @sum(writes_by_file[file]) + } + + printf ("Total reads : %d cnt, %d KB\n", + total_read_cnt, total_read_bytes/1024) + printf ("Total writes: %d cnt, %d KB\n", + total_write_cnt, total_write_bytes/1024) + + printf ("\n# Binary Instances:\n") + foreach (name in target_execs) + printf("%d\t%s\n", target_execs[name], name) + + printf ("\nIO by Process:\n") + foreach (name in execs-) { + rd_cnt = @count(reads_by_exec[name]) + rd_sum = (rd_cnt > 0 ? @sum(reads_by_exec[name])/1024 : 0) + wr_cnt = @count(writes_by_exec[name]) + wr_sum = (wr_cnt > 0 ? @sum(writes_by_exec[name])/1024 : 0) + printf("%5d rds, %5d KB rd, %5d wrs, %5d KB wr: %s\n", + rd_cnt, rd_sum, wr_cnt, wr_sum, name) + } + + printf ("\nIO by File:\n") + foreach (name in files-) { + rd_cnt = @count(reads_by_file[name]) + rd_sum = (rd_cnt > 0 ? @sum(reads_by_file[name])/1024 : 0) + wr_cnt = @count(writes_by_file[name]) + wr_sum = (wr_cnt > 0 ? @sum(writes_by_file[name])/1024 : 0) + printf("%5d rds, %5d KB rd, %5d wrs, %5d KB wr: %s\n", + rd_cnt, rd_sum, wr_cnt, wr_sum, name) + } +} |