]> Zhao Yanbai Git Server - minix.git/commitdiff
libmthread: add stack traces
authorThomas Veerman <thomas@minix3.org>
Fri, 30 Mar 2012 09:16:46 +0000 (09:16 +0000)
committerThomas Veerman <thomas@minix3.org>
Fri, 13 Apr 2012 12:54:02 +0000 (12:54 +0000)
include/minix/mthread.h
lib/libmthread/misc.c

index 786557a09bdeb9c8ef5b55550e4134798acb9687..1ac6b0c707e944a7d80630ccff2bce1d1d3da65d 100644 (file)
@@ -114,6 +114,8 @@ int mthread_setspecific(mthread_key_t key, void *value);
 void mthread_stats(void);
 void mthread_verify_f(char *f, int l);
 #define mthread_verify() mthread_verify_f(__FILE__, __LINE__)
+void mthread_stacktrace(mthread_thread_t t);
+void mthread_stacktraces(void);
 
 /* mutex.c */
 int mthread_mutex_destroy(mthread_mutex_t *mutex);
index ae7a9b2df3806b793e9db842a00c0fddae101920..c9c9f1775594b4918d9799f96a535bf1ae84ae8c 100644 (file)
@@ -109,3 +109,53 @@ void mthread_stats(void)
 }
 
 #endif
+
+
+/*===========================================================================*
+ *                             mthread_stacktrace                           *
+ *===========================================================================*/
+void mthread_stacktrace(mthread_thread_t t)
+{
+  unsigned long bp, hbp, pc;
+  mthread_tcb_t *tcb;
+  ucontext_t *ctx;
+  mcontext_t *mtx;
+  struct stackframe_s *frame;
+
+  printf("thread %d: ", t);
+
+  tcb = mthread_find_tcb(t);
+  ctx = &tcb->m_context;
+  mtx = &ctx->uc_mcontext;
+  frame = &mtx->mc_p_reg;
+  bp = frame->fp;
+
+  while (bp) {
+       pc = ((unsigned long *) bp)[1];
+       hbp = ((unsigned long *) bp)[0];
+
+       printf("0x%lx ", (unsigned long) pc);
+
+       if (hbp != 0 && hbp <= bp) {
+               pc = -1;
+               printf("0x%lx ", (unsigned long) pc);
+               break;
+       }
+       bp = hbp;
+  }
+
+  printf("\n");
+}
+
+/*===========================================================================*
+ *                             mthread_stacktraces                          *
+ *===========================================================================*/
+void mthread_stacktraces(void)
+{
+  mthread_thread_t t;
+
+  mthread_stacktrace(MAIN_THREAD);
+
+  for (t = (mthread_thread_t) 0; t < no_threads; t++)
+       mthread_stacktrace(t);
+}