Poor-mans ftrace with spatch
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 18 Sep 2013 18:40:43 +0000 (11:40 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jan 2014 02:05:50 +0000 (18:05 -0800)
Will add a printk to the entry and exit of every function you spatch.
Doesn't work with multicore, so only use it on core 0.

kern/include/kdebug.h
kern/include/stdio.h
kern/src/kdebug.c
scripts/spatch/poor-ftrace.cocci [new file with mode: 0644]

index 26c0c71..684b44a 100644 (file)
@@ -22,4 +22,10 @@ char *get_fn_name(uintptr_t pc);
 /* Returns the address of sym, or 0 if it does not exist */
 uintptr_t get_symbol_addr(char *sym);
 
+/* For a poor-mans function tracer (can add these with spatch) */
+void __print_func_entry(const char *func, const char *file);
+void __print_func_exit(const char *func, const char *file);
+#define print_func_entry() __print_func_entry(__FUNCTION__, __FILE__)
+#define print_func_exit() __print_func_exit(__FUNCTION__, __FILE__)
+
 #endif /* ROS_KERN_KDEBUG_H */
index a5cc6d7..e25ead5 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <ros/common.h>
 #include <stdarg.h>
+#include <kdebug.h>
 
 #ifndef NULL
 #define NULL   ((void *) 0)
index 0086279..96c69cf 100644 (file)
@@ -49,3 +49,46 @@ uintptr_t get_symbol_addr(char *sym)
        }
        return 0;
 }
+
+static const char *blacklist[] = {
+       "addnode",
+       "addqueue",
+       "allocroute",
+       "balancetree",
+       "calcd",
+       "freeroute",
+       "genrandom",    /* not noisy, just never returns */
+       "rangecompare",
+       "walkadd",
+};
+
+static bool is_blacklisted(const char *s)
+{
+       for (int i = 0; i < ARRAY_SIZE(blacklist); i++) {
+               if (!strcmp(blacklist[i], s))
+                       return TRUE;
+       }
+       return FALSE;
+}
+
+static int tab_depth = 0;
+
+void __print_func_entry(const char *func, const char *file)
+{
+       if (is_blacklisted(func))
+               return;
+       for (int i = 0; i < tab_depth; i++)
+               printk("\t");
+       printk("%s() in %s\n", func, file);
+       tab_depth++;
+}
+
+void __print_func_exit(const char *func, const char *file)
+{
+       if (is_blacklisted(func))
+               return;
+       tab_depth--;
+       for (int i = 0; i < tab_depth; i++)
+               printk("\t");
+       printk("---- %s()\n", func);
+}
diff --git a/scripts/spatch/poor-ftrace.cocci b/scripts/spatch/poor-ftrace.cocci
new file mode 100644 (file)
index 0000000..c51a6c9
--- /dev/null
@@ -0,0 +1,18 @@
+// prints entry/exit when entering/leaving a function
+
+// for example, spatch with:
+// $ for i in kern/src/ns/ kern/src/net kern/drivers/; do \
+//       spatch --sp-file scripts/spatch/poor-ftrace.cocci  --in-place $i; done 
+// if you have functions you want to ignore, add them to the blacklist in
+// kern/src/kdebug.c
+@@
+type t;
+function f;
+@@
+t f(...) {
++print_func_entry();
+<...
++print_func_exit();
+return ...;
+...>
+}