generate stack trace in assert() - useful for debug
implemented for i386, arm is not affected
---
 sys/arch/i386/i386/trap.c |   25 +++++++++++++++----------
 sys/kern/debug.c          |    4 ++++
 2 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/sys/arch/i386/i386/trap.c b/sys/arch/i386/i386/trap.c
index 20fbd22..c5d779c 100755
--- a/sys/arch/i386/i386/trap.c
+++ b/sys/arch/i386/i386/trap.c
@@ -150,10 +150,22 @@ void trap_handler(struct cpu_regs *regs)
 }
 
 #ifdef DEBUG
+void stack_trace(void *sp)
+{
+       int i;
+       u_long *fp = sp;
+       printk("Stack trace:\n");
+       for (i = 0; i < 16; i++) {
+               fp = (u_long *)(*fp);   /* XXX: may cause fault */
+               if (!(*(fp + 1) && *fp))
+                       break;
+               printk(" %08x\n", *(fp + 1));
+       }
+}
+
 static void trap_dump(struct cpu_regs *r)
 {
-       u_long ss, esp, *fp;
-       u_int i;
+       u_long ss, esp;
 
        if (r->cs & 3) {
                ss = r->ss;
@@ -177,13 +189,6 @@ static void trap_dump(struct cpu_regs *r)
               (get_eflags() & EFL_IF) ? "enabled" : "disabled");
        printk(" >> task: id=%x \'%s\'\n", cur_task(), cur_task()->name);
 
-       printk("Stack trace:\n");
-       fp = (u_long *)r->ebp;
-       for (i = 0; i < 16; i++) {
-               fp = (u_long *)(*fp);   /* XXX: may cause fault */
-               if (!(*(fp + 1) && *fp))
-                       break;
-               printk(" %08x\n", *(fp + 1));
-       }
+       stack_trace((void *)r->ebp);
 }
 #endif /* DEBUG */
diff --git a/sys/kern/debug.c b/sys/kern/debug.c
index 3ebd340..235bf3f 100755
--- a/sys/kern/debug.c
+++ b/sys/kern/debug.c
@@ -104,8 +104,12 @@ void printk(const char *fmt, ...)
  */
 void assert(const char *file, int line, const char *exp)
 {
+       extern void stack_trace(void *sp) __attribute__ ((weak));
+
        irq_lock();
        printk("\nAssertion failed: %s line:%d '%s'\n", file, line, exp);
+       if (stack_trace)
+               stack_trace(__builtin_frame_address(1)); /* caller */
        BREAKPOINT();
        for (;;)
                cpu_idle();
-- 
1.5.0.3.GIT




-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Prex-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/prex-devel

Reply via email to