]> sourceware.org Git - systemtap.git/commitdiff
2006-03-09 Martin Hunt <hunt@redhat.com>
authorhunt <hunt>
Thu, 9 Mar 2006 20:01:16 +0000 (20:01 +0000)
committerhunt <hunt>
Thu, 9 Mar 2006 20:01:16 +0000 (20:01 +0000)
* key.stp: Toy example.
* prof.stp: Example profiler.
* top.stp: Print the top 20 syscalls.

examples/click.wav [new file with mode: 0644]
examples/key.stp [new file with mode: 0755]
examples/prof.stp [new file with mode: 0755]
examples/return.wav [new file with mode: 0644]
examples/top.stp [new file with mode: 0755]

diff --git a/examples/click.wav b/examples/click.wav
new file mode 100644 (file)
index 0000000..8214b22
Binary files /dev/null and b/examples/click.wav differ
diff --git a/examples/key.stp b/examples/key.stp
new file mode 100755 (executable)
index 0000000..6334cbb
--- /dev/null
@@ -0,0 +1,22 @@
+#! /usr/bin/env stap
+
+# Useless, but amusing. Based on an idea I saw on a
+# dtrace site. (wav files are from emacs).
+
+// KEY_ENTER = 28
+probe kernel.function("kbd_keycode") {
+       if ($down) {
+               if ($keycode == 28)
+                       system("play return.wav")
+               else
+                       system("play click.wav")
+       }
+}
+
+probe begin {
+       printf("TYPEWRITER ON\n")
+}
+
+probe end {
+       printf("DONE\n")
+}
diff --git a/examples/prof.stp b/examples/prof.stp
new file mode 100755 (executable)
index 0000000..db5bdf9
--- /dev/null
@@ -0,0 +1,35 @@
+#!/usr/bin/env stap
+
+# This is an example of profiling a specific command or pid.
+# It works by recordind the time when a system call is entered
+# exited. 
+
+# Usage: prof.stp -c "top -n5"
+# Will start up "top" and after 5 iterations, will exit.
+#
+# Usage: prof.stp -x 3323
+# Will profile pid 3323 until it ^c is hit.
+#
+
+probe kernel.function("sys_*") {
+       if (target() == tid())
+               calltime[tid()] = gettimeofday_us()
+}
+
+probe kernel.function("sys_*").return {
+       if (target() != tid())  next
+       now = gettimeofday_us()
+       c = calltime[tid()]
+       if (!c) next
+       ttime[probefunc()] <<< now - c
+       delete calltime[tid()]
+}
+
+probe end {
+       printf("\n")
+       foreach (x in ttime)
+               printf("%-20s\tcalls:%6d\tavg time (ms):%5d\ttotal(ms):%7d\n", 
+                       x, @count(ttime[x]), @avg(ttime[x]), @sum(ttime[x]))
+}
+
+global calltime, ttime
diff --git a/examples/return.wav b/examples/return.wav
new file mode 100644 (file)
index 0000000..20f978c
Binary files /dev/null and b/examples/return.wav differ
diff --git a/examples/top.stp b/examples/top.stp
new file mode 100755 (executable)
index 0000000..26d35ec
--- /dev/null
@@ -0,0 +1,28 @@
+#!/usr/bin/env stap 
+#
+# This script continuously lists the top 20 systemcalls on the system
+#
+
+global syscalls
+
+function print_top () {
+       cnt=0
+       log ("SYSCALL\t\t\t\tCOUNT")
+       foreach ([name] in syscalls-) {
+               printf("%-20s\t\t%5d\n",name, syscalls[name])
+               if (cnt++ == 20)
+                       break
+       }
+       printf("--------------------------------------\n")
+       delete syscalls
+}
+
+probe kernel.function("sys_*") {
+       syscalls[probefunc()]++
+}
+
+# print top syscalls every 5 seconds
+probe timer.ms(5000) {
+       print_top ()
+}
+
This page took 0.033355 seconds and 5 git commands to generate.