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