Add trace_printf()
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 30 Sep 2016 16:34:57 +0000 (12:34 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 6 Oct 2016 19:41:48 +0000 (15:41 -0400)
This is a helper for userspace to print into the kernel's trace_printk()
log.  It's extremely useful for fast print debugging.

The trace_printk() log currently just maintains the last N entries, with
older entries replaced by newer ones.  You can cat it or tail it
repeatedly.  The log file is usually at /prof/kptrace.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/debug.c
user/parlib/include/parlib/ros_debug.h

index 46a3e4e..42d72b0 100644 (file)
@@ -4,6 +4,9 @@
 #include <unistd.h>
 #include <parlib/spinlock.h>
 #include <ros/common.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 
 int akaros_printf(const char *format, ...)
 {
@@ -75,3 +78,28 @@ void __print_func_exit(const char *func, const char *file)
        printf("---- %s()\n", func);
        spinlock_unlock(&lock);
 }
+
+void trace_printf(const char *fmt, ...)
+{
+       static int kptrace;
+       va_list args;
+       char buf[128];
+       int amt;
+
+       run_once(
+               kptrace = open("#kprof/kptrace", O_WRITE);
+               if (kptrace < 0)
+                       perror("Unable to open kptrace!\n");
+       );
+
+       if (kptrace < 0)
+               return;
+       amt = snprintf(buf, sizeof(buf), "PID %d: ", getpid());
+       /* amt could be > sizeof, if we truncated. */
+       amt = MIN(amt, sizeof(buf));
+       va_start(args, fmt);
+       /* amt == sizeof is OK here */
+       amt += vsnprintf(buf + amt, sizeof(buf) - amt, fmt, args);
+       va_end(args);
+       write(kptrace, buf, MIN(amt, sizeof(buf)));
+}
index 5a7c259..059dadb 100644 (file)
@@ -15,6 +15,7 @@ __BEGIN_DECLS
        int ret = snprintf(buf, sizeof(buf), __VA_ARGS__);                         \
        write(2, buf, ret);                                                        \
 }
+void trace_printf(const char *fmt, ...);
 
 /* For a poor-mans function tracer (can add these with spatch) */
 void __print_func_entry(const char *func, const char *file);