Poor-man's ftracing for userspace
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 29 Apr 2014 22:37:28 +0000 (15:37 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 29 Apr 2014 23:45:27 +0000 (16:45 -0700)
Make sure whatever you trace has #included parlib.h.

user/parlib/debug.c
user/parlib/include/ros_debug.h

index 354589c..b09e619 100644 (file)
@@ -8,6 +8,7 @@
 #include <ros/common.h>
 #include <parlib.h>
 #include <stdio.h>
+#include <spinlock.h>
 
 // Collect up to BUF_SIZE characters into a buffer
 // and perform ONE system call to print all of them,
@@ -56,3 +57,63 @@ int ros_debug(const char *fmt, ...)
 
        return cnt;
 }
+
+/* Poor man's Ftrace, won't work well with concurrency. */
+static const char *blacklist[] = {
+       "whatever",
+};
+
+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;
+static bool print = TRUE;
+
+void reset_print_func_depth(void)
+{
+       tab_depth = 0;
+}
+
+void toggle_print_func(void)
+{
+       print = !print;
+       printf("Func entry/exit printing is now %sabled\n", print ? "en" : "dis");
+}
+
+static spinlock_t lock = {0};
+
+void __print_func_entry(const char *func, const char *file)
+{
+       if (!print)
+               return;
+       if (is_blacklisted(func))
+               return;
+       spinlock_lock(&lock);
+       printd("Vcore %2d", vcore_id());        /* helps with multicore output */
+       for (int i = 0; i < tab_depth; i++)
+               printf("\t");
+       printf("%s() in %s\n", func, file);
+       spinlock_unlock(&lock);
+       tab_depth++;
+}
+
+void __print_func_exit(const char *func, const char *file)
+{
+       if (!print)
+               return;
+       if (is_blacklisted(func))
+               return;
+       tab_depth--;
+       spinlock_lock(&lock);
+       printd("Vcore %2d", vcore_id());
+       for (int i = 0; i < tab_depth; i++)
+               printf("\t");
+       printf("---- %s()\n", func);
+       spinlock_unlock(&lock);
+}
index 77de946..6ab66c4 100644 (file)
@@ -22,6 +22,12 @@ int  ros_vdebug(const char *fmt, va_list);
 #define printd(args...) {}
 #endif
 
+/* 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__)
+
 #ifdef __cplusplus
 }
 #endif