summaryrefslogtreecommitdiffstats
path: root/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-rw.stp
diff options
context:
space:
mode:
Diffstat (limited to 'stap_tutorial-1.0/examples/cmd-eval/cmd-eval-rw.stp')
-rwxr-xr-xstap_tutorial-1.0/examples/cmd-eval/cmd-eval-rw.stp104
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)
+ }
+}