Add backtrace_current_ctx()
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 29 Sep 2017 14:36:31 +0000 (10:36 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 29 Sep 2017 14:45:23 +0000 (10:45 -0400)
This is a convenience helper.  I'll use it for one-off tracing attempts.
For instance, in sys_openat(), you can do this:

if (!strcmp(path, "hello.txt"))
backtrace_current_ctx();

And then at runtime when catting hello.txt you'll see:

Backtrace of user context on Core 0:
Offsets only matter for shared libraries
 #01 Addr 0x00003000000d2cee is in libc-2.19.so at offset 0x00000000000d0cee
 #02 Addr 0x00003000000ca200 is in libc-2.19.so at offset 0x00000000000c8200
 #03 Addr 0x0000000000415f47 is in busybox at offset 0x0000000000015f47
 #04 Addr 0x002f3d4457500074 has no VMR

which you can pipe through scripts/bt-akaros.sh.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/kdebug.h
kern/src/kdebug.c

index b3effb4..f8744c1 100644 (file)
@@ -27,6 +27,8 @@ void backtrace_user_frame(uintptr_t pc, uintptr_t fp);
 void backtrace_hwtf(struct hw_trapframe *hw_tf);
 /* Backtraces a user context */
 void backtrace_user_ctx(struct proc *p, struct user_context *ctx);
+/* Backtraces the current user context, if there is one */
+void backtrace_current_ctx(void);
 
 /*** Programmatic Backtraces */
 /* Backtraces a PC/FP, stores results in *pcs, with no protections */
index 8480c1e..6381147 100644 (file)
@@ -281,6 +281,12 @@ void backtrace_user_ctx(struct proc *p, struct user_context *ctx)
        switch_back(p, st_save);
 }
 
+void backtrace_current_ctx(void)
+{
+       if (current)
+               backtrace_user_ctx(current, current_ctx);
+}
+
 static spinlock_t __px_lock = SPINLOCK_INITIALIZER_IRQSAVE;
 void px_lock(void)
 {