summaryrefslogtreecommitdiffstats
path: root/stap_tutorial-1.0/examples
diff options
context:
space:
mode:
Diffstat (limited to 'stap_tutorial-1.0/examples')
-rwxr-xr-xstap_tutorial-1.0/examples/cmd-eval/cmd-eval-futexes.stp44
-rwxr-xr-xstap_tutorial-1.0/examples/cmd-eval/cmd-eval-opens.stp73
-rwxr-xr-xstap_tutorial-1.0/examples/cmd-eval/cmd-eval-rw.stp104
-rwxr-xr-xstap_tutorial-1.0/examples/cmd-eval/cmd-eval-syscalls.stp33
-rwxr-xr-xstap_tutorial-1.0/examples/fs-io-1.stp26
-rwxr-xr-xstap_tutorial-1.0/examples/fs-io-2.stp26
-rwxr-xr-xstap_tutorial-1.0/examples/helloworld.stp6
-rwxr-xr-xstap_tutorial-1.0/examples/probe-types.stp38
-rwxr-xr-xstap_tutorial-1.0/examples/read-write-1.stp25
-rwxr-xr-xstap_tutorial-1.0/examples/read-write-2.stp27
-rwxr-xr-xstap_tutorial-1.0/examples/read-write-3.stp35
-rwxr-xr-xstap_tutorial-1.0/examples/socktop318
-rw-r--r--stap_tutorial-1.0/examples/tapset/fs.stp27
-rwxr-xr-xstap_tutorial-1.0/examples/top-cs.stp29
-rwxr-xr-xstap_tutorial-1.0/examples/top-ext3calls.stp19
-rwxr-xr-xstap_tutorial-1.0/examples/top-syscalls.stp16
16 files changed, 846 insertions, 0 deletions
diff --git a/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-futexes.stp b/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-futexes.stp
new file mode 100755
index 0000000..8f2b414
--- /dev/null
+++ b/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-futexes.stp
@@ -0,0 +1,44 @@
+#!/usr/bin/env stap
+
+global target_pids, target_execs
+global thread_thislock, thread_blocktime
+global FUTEX_WAIT = 0, FUTEX_WAKE = 1
+global lock_waits
+
+probe process.exec_complete {
+ if (success && (ppid() in target_pids || pid() == target()))
+ target_pids[pid()] = kernel_string($filename)
+}
+
+probe syscall.futex {
+ if (!(pid() in target_pids)) next
+
+ if (op != FUTEX_WAIT) next # ignore originators of WAKE events
+
+ t = tid()
+ thread_thislock[t] = $uaddr
+ thread_blocktime[t] = gettimeofday_us()
+}
+
+probe syscall.futex.return {
+ if (!(pid() in target_pids)) next
+
+ if (op != FUTEX_WAIT) next # ignore originators of WAKE events
+
+ t = tid()
+ ts = thread_blocktime[t]
+ if (ts) {
+ elapsed = gettimeofday_us() - ts
+ lock_waits[pid(), thread_thislock[t]] <<< elapsed
+ delete thread_blocktime[t]
+ delete thread_thislock[t]
+ }
+}
+
+probe end {
+ foreach ([pid, lock] in lock_waits)
+ printf ("%s[%d] lock %p contended %5d times, %9d avg us\n",
+ target_pids[pid], pid, lock,
+ @count(lock_waits[pid, lock]),
+ @avg(lock_waits[pid, lock]))
+}
diff --git a/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-opens.stp b/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-opens.stp
new file mode 100755
index 0000000..a040059
--- /dev/null
+++ b/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-opens.stp
@@ -0,0 +1,73 @@
+#!/usr/bin/env stap
+
+global target_pids, target_execs
+global opens_by_file_success, opens_by_exec_success, total_opens_success
+global opens_by_file_fail, opens_by_exec_fail, total_opens_fail
+global closes_by_exec, total_closes
+global open_failure_by_type
+
+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.open.return {
+ if (!(pid() in target_pids)) next
+
+ if ($return >= 0) {
+ opens_by_exec_success[target_pids[pid()]] ++
+ opens_by_file_success[user_string($filename)] ++
+ total_opens_success ++
+ } else {
+ opens_by_exec_fail[target_pids[pid()]] ++
+ opens_by_file_fail[user_string($filename)] ++
+ open_failure_by_type[retstr] ++
+ total_opens_fail ++
+ }
+}
+
+probe syscall.close {
+ if (!(pid() in target_pids)) next
+
+ closes_by_exec[target_pids[pid()]] ++
+ total_closes ++
+}
+
+probe end {
+ prt_limit = 10
+
+ printf ("Total opens: %d (%d succeeded, %d failed)\n",
+ total_opens_success + total_opens_fail,
+ total_opens_success, total_opens_fail)
+ printf ("Total closes: %d\n\n", total_closes)
+
+ printf ("# Binary Instances:\n")
+ foreach(name in target_execs)
+ printf("%d\t%s\n", target_execs[name], name)
+
+ printf("\n# Successful Opens by Binary:\n")
+ foreach (name in opens_by_exec_success-)
+ printf("%d\t%s\n", opens_by_exec_success[name], name)
+
+ printf("\n# Failed Opens by Binary:\n")
+ foreach (name in opens_by_exec_fail-)
+ printf("%d\t%s\n", opens_by_exec_fail[name], name)
+
+ printf("\n# Successful Opens by File (top %d):\n", prt_limit)
+ foreach (name in opens_by_file_success- limit prt_limit)
+ printf("%d\t%s\n", opens_by_file_success[name], name)
+
+ printf("\n# Failed Opens by File: (top %d)\n", prt_limit)
+ foreach (name in opens_by_file_fail- limit prt_limit)
+ printf("%d\t%s\n", opens_by_file_fail[name], name)
+
+ printf("\n# Closes by Binary:\n")
+ foreach (name in closes_by_exec-)
+ printf("%d\t%s\n", closes_by_exec[name], name)
+
+ printf("\n# Open Failures by Type:\n")
+ foreach (type in open_failure_by_type-)
+ printf("%d\t%s\n", open_failure_by_type[type], type)
+}
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)
+ }
+}
diff --git a/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-syscalls.stp b/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-syscalls.stp
new file mode 100755
index 0000000..17e7d95
--- /dev/null
+++ b/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-syscalls.stp
@@ -0,0 +1,33 @@
+#!/usr/bin/env stap
+
+global target_pids, target_execs
+global syscalls_per_exec, syscalls_by_exec, syscalls
+
+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.* {
+ if (!(pid() in target_pids)) next
+
+ syscalls_by_exec[name, target_pids[pid()]] ++
+ syscalls_per_exec[target_pids[pid()]] ++
+ syscalls[name] ++
+}
+
+probe end {
+ printf("\nIndividual System Calls by Binary:\n" )
+ foreach ([name, exec] in syscalls_by_exec-)
+ printf("%8d %-20s\t%s\n", syscalls_by_exec[name, exec], name, exec)
+
+ printf("\nTotal System Calls by Binary:\n" )
+ foreach (exec in syscalls_per_exec-)
+ printf("%8d %-20s\n", syscalls_per_exec[exec], exec)
+
+ printf("\nSystem Calls over all:\n")
+ foreach (name in syscalls-)
+ printf("%8d %-20s\n", syscalls[name], name)
+}
diff --git a/stap_tutorial-1.0/examples/fs-io-1.stp b/stap_tutorial-1.0/examples/fs-io-1.stp
new file mode 100755
index 0000000..83462e9
--- /dev/null
+++ b/stap_tutorial-1.0/examples/fs-io-1.stp
@@ -0,0 +1,26 @@
+#!/usr/bin/env stap
+
+global reads, writes, total_io
+
+probe fs.read.return {
+ pname = execname()
+ reads[pname] += bytes
+ total_io[pname] += bytes
+}
+
+probe fs.write.return {
+ pname = execname()
+ writes[pname] += bytes
+ total_io[pname] += bytes
+}
+
+probe timer.s(10) {
+ foreach(pname in total_io- limit 10)
+ printf("%15s r: %8d KB w: %8d KB\n",
+ pname, reads[pname]/1024, writes[pname]/1024)
+ printf("\n")
+ delete reads
+ delete writes
+ delete total_io
+}
+
diff --git a/stap_tutorial-1.0/examples/fs-io-2.stp b/stap_tutorial-1.0/examples/fs-io-2.stp
new file mode 100755
index 0000000..09036b2
--- /dev/null
+++ b/stap_tutorial-1.0/examples/fs-io-2.stp
@@ -0,0 +1,26 @@
+#!/usr/bin/env stap
+
+global reads, writes, total_io
+
+probe fs.read.return {
+ fn = file2name($file)
+ reads[fn] += bytes
+ total_io[fn] += bytes
+}
+
+probe fs.write.return {
+ fn = file2name($file)
+ writes[fn] += bytes
+ total_io[fn] += bytes
+}
+
+probe timer.s(10) {
+ foreach(fname in total_io- limit 20) {
+ printf("r: %8d KB w: %8d KB %s\n",
+ reads[fname]/1024, writes[fname]/1024, fname)
+ }
+ printf("\n")
+ delete reads
+ delete writes
+ delete total_io
+}
diff --git a/stap_tutorial-1.0/examples/helloworld.stp b/stap_tutorial-1.0/examples/helloworld.stp
new file mode 100755
index 0000000..e08ecb8
--- /dev/null
+++ b/stap_tutorial-1.0/examples/helloworld.stp
@@ -0,0 +1,6 @@
+#!/usr/bin/env stap
+
+probe begin {
+ printf("Hello World!\n")
+ exit()
+}
diff --git a/stap_tutorial-1.0/examples/probe-types.stp b/stap_tutorial-1.0/examples/probe-types.stp
new file mode 100755
index 0000000..08da226
--- /dev/null
+++ b/stap_tutorial-1.0/examples/probe-types.stp
@@ -0,0 +1,38 @@
+#!/usr/bin/env stap
+
+global reads, writes
+global sema_contentions
+global ext3_releases
+
+probe begin {
+ printf("Collecting data... ")
+}
+
+probe kernel.function("sys_read") {
+ reads++
+}
+
+probe syscall.write {
+ writes++
+}
+
+probe timer.s (20) {
+ exit()
+}
+
+probe module("ext3").function("ext3_release_file") {
+ ext3_releases++
+}
+
+probe kernel.statement("*@lib/semaphore-sleepers.c:82") {
+ sema_contentions++
+}
+
+probe end {
+ printf("done\n")
+ printf("# ext3 file releases = %d\n", ext3_releases)
+ printf("# semaphore contentions = %d\n", sema_contentions)
+ printf("# reads = %d\n", reads)
+ printf("# writes = %d\n", writes)
+}
+
diff --git a/stap_tutorial-1.0/examples/read-write-1.stp b/stap_tutorial-1.0/examples/read-write-1.stp
new file mode 100755
index 0000000..5abd35f
--- /dev/null
+++ b/stap_tutorial-1.0/examples/read-write-1.stp
@@ -0,0 +1,25 @@
+#!/usr/bin/env stap
+
+global reads, writes
+
+probe begin {
+ printf("Collecting data...\n")
+}
+
+probe syscall.read {
+ reads[execname()]++
+}
+
+probe syscall.write {
+ writes[execname()]++
+}
+
+probe end {
+ printf("Reads by process name:\n")
+ foreach (name in reads-)
+ printf("%d\t%s\n", reads[name], name)
+
+ printf("Writes by process name:\n")
+ foreach (name in writes-)
+ printf("%d\t%s\n", writes[name], name)
+}
diff --git a/stap_tutorial-1.0/examples/read-write-2.stp b/stap_tutorial-1.0/examples/read-write-2.stp
new file mode 100755
index 0000000..d6a647b
--- /dev/null
+++ b/stap_tutorial-1.0/examples/read-write-2.stp
@@ -0,0 +1,27 @@
+#!/usr/bin/env stap
+
+global reads, writes
+
+probe begin {
+ printf("Collecting data...\n")
+}
+
+probe syscall.read.return {
+ if ($return > 0)
+ reads[execname()] += $return
+}
+
+probe syscall.write.return {
+ if ($return > 0)
+ writes[execname()] += $return
+}
+
+probe end {
+ printf("Bytes read by process name:\n")
+ foreach (name in reads-)
+ printf("%10d %s\n", reads[name], name)
+
+ printf("Bytes written by process name:\n")
+ foreach (name in writes-)
+ printf("%10d %s\n", writes[name], name)
+}
diff --git a/stap_tutorial-1.0/examples/read-write-3.stp b/stap_tutorial-1.0/examples/read-write-3.stp
new file mode 100755
index 0000000..fef85a5
--- /dev/null
+++ b/stap_tutorial-1.0/examples/read-write-3.stp
@@ -0,0 +1,35 @@
+#!/usr/bin/env stap
+
+global reads, writes
+
+probe begin {
+ printf("Collecting data...\n")
+}
+
+probe syscall.read.return {
+ if ($return > 0)
+ reads <<< $return
+}
+
+probe syscall.write.return {
+ if ($return > 0)
+ writes <<< $return
+}
+
+probe end {
+ printf("Read sizes summary:\n")
+
+ printf("\tcount:%d, sum:%d, avg:%d, min:%d, max:%d\n",
+ @count(reads), @sum(reads), @avg(reads),
+ @min(reads), @max(reads))
+
+ print(@hist_log(reads))
+
+ printf("Write sizes summary:\n")
+
+ printf("\tcount:%d, sum:%d, avg:%d, min:%d, max:%d\n",
+ @count(writes), @sum(writes), @avg(writes),
+ @min(writes), @max(writes))
+
+ print(@hist_log(writes))
+}
diff --git a/stap_tutorial-1.0/examples/socktop b/stap_tutorial-1.0/examples/socktop
new file mode 100755
index 0000000..123e37e
--- /dev/null
+++ b/stap_tutorial-1.0/examples/socktop
@@ -0,0 +1,318 @@
+#!/bin/bash
+
+# Socktop systemtap script
+# Copyright (C) 2006 IBM Corp.
+#
+# This file is part of systemtap, and is free software. You can
+# redistribute it and/or modify it under the terms of the GNU General
+# Public License (GPL); either version 2, or (at your option) any
+# later version.
+
+###
+### socktop - Combination shell/systemtap script to track reads and writes
+### on sockets by process. Can be filtered by process IDs and
+### names, protocols, protocol families, users and socket type.
+###
+
+# Filter options
+F_PROTSTR=""; F_PROT=0 # Filter by protocol
+F_FAMSTR=""; F_FAM=0 # Filter by protocol family
+F_TYPESTR=""; F_TYPE=0 # Filter by socket type
+F_PIDSTR=""; F_PID=0 # Filter by process ID
+F_NAMESTR=""; F_NAME=0 # Filter by process name
+F_UIDSTR=""; F_UID=0 # Filter by user
+FILTER=0 # Any filters specified?
+
+# Print options
+P_INTERVAL=5 # default interval between output
+P_DEVICES=0 # default is don't display network device traffic
+P_NUMTOP=10 # default number of processes and network devices to print
+
+DELIM=","
+
+function usage {
+ echo "USAGE: socktop [-d] [-i interval] [-N num] [-P protocol]... [-f family]..."
+ echo " [-t stype]... [-n pname]... [-p pid]... [-u username]... [-h]"
+ echo " -d # print network device traffic (default: off)"
+ echo " -i interval # interval in seconds between printing (default: $P_INTERVAL)"
+ echo " -N num # number of top processes and devices to print (default: $P_NUMTOP)"
+ echo " -f family # this protocol family only (default: all)"
+ echo " -P protocol # this protocol only (default: all)"
+ echo " -t stype # this socket type only (default: all)"
+ echo " -n pname # this process name only (default: all)"
+ echo " -p pid # this process ID only (default: all)"
+ echo " -u username # this user only (default: all)"
+ echo " -h # print this help text"
+ echo ""
+ echo "Protocol Families:"
+ echo " LOCAL, INET, INET6, IPX, NETLINK, X25, AX25, ATMPVC, APPLETALK, PACKET"
+ echo ""
+ echo "Protocols:"
+ echo " TCP, UDP, SCTP, IP, FC, ... (see /etc/protocols for complete list)"
+ echo ""
+ echo "Socket Types:"
+ echo " STREAM, DGRAM, RAW, RDM, SEQPACKET, DCCP, PACKET"
+}
+
+# Process options
+while getopts df:i:n:N:P:p:t:u:h option; do
+ case $option in
+ d) P_DEVICES=1 ;;
+ i) P_INTERVAL=$OPTARG ;;
+ N) P_NUMTOP=$OPTARG ;;
+ f) let "F_FAM++"
+ F_FAMSTR=$OPTARG$DELIM$F_FAMSTR ;;
+ n) let "F_NAME++"
+ F_NAMESTR=$OPTARG$DELIM$F_NAMESTR ;;
+ p) let "F_PID++"
+ F_PIDSTR=$OPTARG$DELIM$F_PIDSTR ;;
+ P) let "F_PROT++"
+ F_PROTSTR=$OPTARG$DELIM$F_PROTSTR ;;
+ t) let "F_TYPE++"
+ F_TYPESTR=$OPTARG$DELIM$F_TYPESTR ;;
+ u) uid=`awk -F: '$1 == name {print $3}' name=$OPTARG /etc/passwd`
+ if [[ $uid != "" ]]; then
+ let "F_UID++"
+ F_UIDSTR=$uid$DELIM$F_UIDSTR
+ else
+ echo "ERROR: Unknown user:" $OPTARG
+ let "ERROR++"
+ fi ;;
+ h|?|*) usage
+ exit 1 ;;
+ esac
+done
+
+if [[ $ERROR > 0 ]]; then
+ exit 1
+fi
+
+if [[ $F_FAM > 0 || $F_NAME > 0 || $F_PID > 0 ||
+ $F_PROT > 0 || $F_TYPE > 0 || $F_UID > 0 ]]; then
+ FILTER=1
+fi
+
+#
+# Pass a timezone adjustment value to the stap script
+#
+TZ=`date "+%z"`
+TZ_SIGN=`echo $TZ | cut -c1`
+TZ_HOURS=`echo $TZ | cut -c2-3`
+TZ_MINS=`echo $TZ | cut -c4-5`
+TZ_ADJUST=$TZ_SIGN$((10#$TZ_HOURS*60*60+10#$TZ_MINS*60))
+
+#
+# Start the systemtap script
+#
+stap -e '
+global execname, user, if_tx, if_rx, if_dev
+global sk_tx, sk_rx, sk_pid
+global f_name_str, f_pid_str, f_prot_str, f_fam_str, f_type_str, f_uid_str
+global f_name, f_pid, f_prot, f_fam, f_type, f_uid
+
+probe begin
+{
+ # If no filters specified, skip filter processing
+ if ('$FILTER' == 0) next
+
+ f_name_str = "'$F_NAMESTR'"
+ f_pid_str = "'$F_PIDSTR'"
+ f_prot_str = "'$F_PROTSTR'"
+ f_fam_str = "'$F_FAMSTR'"
+ f_type_str = "'$F_TYPESTR'"
+ f_uid_str = "'$F_UIDSTR'"
+
+ delim = "'$DELIM'"
+ error = 0
+
+ # Protocols
+ if ('$F_PROT') {
+ prot = tokenize(f_prot_str, delim)
+ while (prot != "") {
+ p = sock_prot_str2num(prot)
+ if (p < 0) {
+ printf("ERROR: Unknown protocol: %s\n", prot)
+ error++
+ } else
+ f_prot[p] = 1
+ prot = tokenize("", delim)
+ }
+ }
+
+ # Protocol families
+ if ('$F_FAM') {
+ fam = tokenize(f_fam_str, delim)
+ while (fam != "") {
+ f = sock_fam_str2num(fam)
+ if (f < 0) {
+ printf("ERROR: Unknown protocol family: %s\n", fam)
+ error++
+ } else
+ f_fam[f] = 1
+ fam = tokenize("", delim)
+ }
+ }
+
+ # Process names
+ if ('$F_NAME') {
+ pname = tokenize(f_name_str, delim)
+ while (pname != "") {
+ f_name[pname] = 1
+ pname = tokenize("", delim)
+ }
+ }
+
+ # Process IDs
+ if ('$F_PID') {
+ pid = tokenize(f_pid_str, delim)
+ while (pid != "") {
+ f_pid[strtol(pid, 10)] = 1
+ pid = tokenize("", delim)
+ }
+ }
+
+ # Socket types
+ if ('$F_TYPE') {
+ stype = tokenize(f_type_str, delim)
+ while (stype != "") {
+ t = sock_type_str2num(stype)
+ if (t < 0) {
+ printf("ERROR: Unknown socket type: %s\n", stype)
+ error++
+ } else
+ f_type[t] = 1
+ stype = tokenize("", delim)
+ }
+ }
+
+ # User IDs
+ if ('$F_UID') {
+ uid = tokenize(f_uid_str, delim)
+ while (uid != "") {
+ f_uid[strtol(uid, 10)] = 1
+ uid = tokenize("", delim)
+ }
+ }
+
+ if (error) exit()
+}
+
+probe netdev.transmit
+{
+ if ('$P_DEVICES') {
+ if_tx[dev_name] <<< length
+ if_dev[dev_name] ++
+ }
+}
+
+probe netdev.receive
+{
+ if ('$P_DEVICES') {
+ if_rx[dev_name] <<< length
+ if_dev[dev_name] ++
+ }
+}
+
+probe socket.send
+{
+ if (!success) next
+
+ pid = pid()
+ uid = uid()
+ ename = execname()
+
+ # Check filters
+ if ('$FILTER') {
+ if ('$F_PROT' && !(protocol in f_prot)) next
+ if ('$F_FAM' && !(family in f_fam)) next
+ if ('$F_PID' && !(pid in f_pid)) next
+ if ('$F_NAME' && !(ename in f_name)) next
+ if ('$F_UID' && !(uid in f_uid)) next
+ if ('$F_TYPE' && !(type in f_type)) next
+ }
+
+ execname[pid] = ename
+ user[pid] = uid
+ sk_tx[pid, protocol, family] <<< size
+ sk_pid[pid, protocol, family] += size
+}
+
+probe socket.receive
+{
+ if (!success) next
+
+ pid = pid()
+ uid = uid()
+ ename = execname()
+
+ # Check filters
+ if ('$FILTER') {
+ if ('$F_PROT' && !(protocol in f_prot)) next
+ if ('$F_FAM' && !(family in f_fam)) next
+ if ('$F_PID' && !(pid in f_pid)) next
+ if ('$F_NAME' && !(ename in f_name)) next
+ if ('$F_UID' && !(uid in f_uid)) next
+ if ('$F_TYPE' && !(type in f_type)) next
+ }
+
+ execname[pid] = ename
+ user[pid] = uid
+ sk_rx[pid, protocol, family] <<< size
+ sk_pid[pid, protocol, family] += size
+}
+
+function print_activity()
+{
+ # Print top processes
+ max = '$P_NUMTOP'
+ time = gettimeofday_s() + '$TZ_ADJUST'
+
+ printf("======================= %s ========================\n", ctime(time))
+ printf("------------------------------- PROCESSES -------------------------------\n")
+ printf("%-5s %-5s %7s %7s %7s %7s %-4s %-8s %-15s\n",
+ "PID", "UID", "#SEND", "#RECV", "SEND_KB",
+ "RECV_KB", "PROT", "FAMILY", "COMMAND")
+ foreach ([pid, prot, fam] in sk_pid- limit max) {
+ n_sk_tx = @count(sk_tx[pid, prot, fam])
+ n_sk_rx = @count(sk_rx[pid, prot, fam])
+ printf("%-5d %-5d %7d %7d %7d %7d %-4s %-8s %-15s\n",
+ pid, user[pid], n_sk_tx, n_sk_rx,
+ n_sk_tx ? @sum(sk_tx[pid, prot, fam])/1024 : 0,
+ n_sk_rx ? @sum(sk_rx[pid, prot, fam])/1024 : 0,
+ sock_prot_num2str(prot), sock_fam_num2str(fam),
+ execname[pid])
+ }
+
+ # Print top network devices
+ if ('$P_DEVICES') {
+ max = '$P_NUMTOP'
+ printf("-------------------------------- DEVICES --------------------------------\n")
+ printf("%-7s %13s %13s %15s %15s\n",
+ "DEV", "#XMIT", "#RECV", "XMIT_KB", "RECV_KB")
+ foreach ([dev] in if_dev- limit max) {
+ n_if_tx = @count(if_tx[dev])
+ n_if_rx = @count(if_rx[dev])
+ printf("%-7s %13d %13d %15d %15d\n", dev, n_if_tx, n_if_rx,
+ n_if_tx ? @sum(if_tx[dev])/1024 : 0,
+ n_if_rx ? @sum(if_rx[dev])/1024 : 0)
+ }
+ }
+
+ printf("=========================================================================\n\n")
+
+ delete execname
+ delete user
+ delete sk_tx
+ delete sk_rx
+ delete sk_pid
+ delete if_tx
+ delete if_rx
+ delete if_dev
+}
+
+
+probe timer.s('$P_INTERVAL')
+{
+ print_activity()
+}
+'
diff --git a/stap_tutorial-1.0/examples/tapset/fs.stp b/stap_tutorial-1.0/examples/tapset/fs.stp
new file mode 100644
index 0000000..1ed9afa
--- /dev/null
+++ b/stap_tutorial-1.0/examples/tapset/fs.stp
@@ -0,0 +1,27 @@
+
+probe fs.read.return = kernel.function("vfs_read").return {
+ bytes = ($return > 0 ? $return : 0)
+}
+
+probe fs.write.return = kernel.function("vfs_write").return {
+ bytes = ($return > 0 ? $return : 0)
+}
+
+function file2name:string(filep:long)
+%{
+ char *start = NULL, buf[MAXSTRINGLEN];
+ struct dentry *dentry = NULL;
+ struct vfsmount *mnt = NULL;
+ struct file *file = (struct file *)(long) kread(&(THIS->filep));
+
+ 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);
+
+ CATCH_DEREF_FAULT();
+%}
diff --git a/stap_tutorial-1.0/examples/top-cs.stp b/stap_tutorial-1.0/examples/top-cs.stp
new file mode 100755
index 0000000..efe5769
--- /dev/null
+++ b/stap_tutorial-1.0/examples/top-cs.stp
@@ -0,0 +1,29 @@
+#!/usr/bin/env stap
+#
+# Continuously list the top context switchers
+#
+
+global processes
+
+probe begin {
+ printf("Collecting data...\n")
+}
+
+function print_top () {
+ printf("Process\t\t\t\tCount\n")
+ printf("--------------------------------------\n")
+ foreach (name in processes- limit 20)
+ printf("%-20s\t\t%5d\n",name, processes[name])
+ printf("--------------------------------------\n\n")
+ delete processes
+}
+
+probe scheduler.cpu_on {
+ processes[execname()]++
+}
+
+# print top context switchers every 10 seconds
+probe timer.s(10) {
+ print_top ()
+}
+
diff --git a/stap_tutorial-1.0/examples/top-ext3calls.stp b/stap_tutorial-1.0/examples/top-ext3calls.stp
new file mode 100755
index 0000000..039e6a1
--- /dev/null
+++ b/stap_tutorial-1.0/examples/top-ext3calls.stp
@@ -0,0 +1,19 @@
+#!/usr/bin/env stap
+
+global ext3calls
+
+probe begin {
+ printf("Collecting data...\n")
+}
+
+probe kernel.function("*@fs/ext3") ?,
+ module("ext3").function("*@fs/ext3/*") ?
+{
+ ext3calls[probefunc()]++
+}
+
+probe end {
+ foreach (name in ext3calls- limit 20)
+ printf("%10d %s\n", ext3calls[name], name)
+}
+
diff --git a/stap_tutorial-1.0/examples/top-syscalls.stp b/stap_tutorial-1.0/examples/top-syscalls.stp
new file mode 100755
index 0000000..a5288c6
--- /dev/null
+++ b/stap_tutorial-1.0/examples/top-syscalls.stp
@@ -0,0 +1,16 @@
+#!/usr/bin/env stap
+
+global syscalls
+
+probe begin {
+ printf("Collecting data...\n")
+}
+
+probe syscall.* {
+ syscalls[name]++
+}
+
+probe end {
+ foreach (name in syscalls- limit 10)
+ printf("%10d %s\n", syscalls[name], name)
+}