Improved stack tracer, traces over iframes.
This commit is contained in:
@@ -91,6 +91,41 @@ struct stack_frame {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
is_iframe(addr_t frame)
|
||||||
|
{
|
||||||
|
addr_t previousFrame = *(addr_t*)frame;
|
||||||
|
return ((previousFrame & ~IFRAME_TYPE_MASK) == 0 && previousFrame != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_iframe(struct iframe* frame)
|
||||||
|
{
|
||||||
|
bool isUser = IFRAME_IS_USER(frame);
|
||||||
|
|
||||||
|
kprintf("%s iframe at %p (end = %p)\n", isUser ? "user" : "kernel", frame,
|
||||||
|
isUser ? (uint64*)(frame + 1) : &frame->user_rsp);
|
||||||
|
|
||||||
|
kprintf(" rax 0x%-16lx rbx 0x%-16lx rcx 0x%-16lx rdx 0x%lx\n",
|
||||||
|
frame->rax, frame->rbx, frame->rcx, frame->rdx);
|
||||||
|
kprintf(" rsi 0x%-16lx rdi 0x%-16lx rbp 0x%-16lx r8 0x%lx\n",
|
||||||
|
frame->rsi, frame->rdi, frame->rbp, frame->r8);
|
||||||
|
kprintf(" r9 0x%-16lx r10 0x%-16lx r11 0x%-16lx r12 0x%lx\n",
|
||||||
|
frame->r9, frame->r10, frame->r11, frame->r12);
|
||||||
|
kprintf(" r13 0x%-16lx r14 0x%-16lx r15 0x%-16lx\n",
|
||||||
|
frame->r13, frame->r14, frame->r15);
|
||||||
|
kprintf(" rip 0x%-16lx rflags 0x%-16lx", frame->rip, frame->flags);
|
||||||
|
if (isUser) {
|
||||||
|
// from user space
|
||||||
|
kprintf("user rsp 0x%lx", frame->user_rsp);
|
||||||
|
}
|
||||||
|
kprintf("\n");
|
||||||
|
kprintf(" vector: 0x%lx, error code: 0x%lx\n", frame->vector,
|
||||||
|
frame->error_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
arch_debug_stack_trace(void)
|
arch_debug_stack_trace(void)
|
||||||
{
|
{
|
||||||
@@ -102,14 +137,25 @@ arch_debug_stack_trace(void)
|
|||||||
if (rbp == 0)
|
if (rbp == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
stack_frame* frame = (stack_frame*)rbp;
|
if (is_iframe(rbp)) {
|
||||||
if (frame->return_address == 0)
|
struct iframe* frame = (struct iframe*)rbp;
|
||||||
break;
|
print_iframe(frame);
|
||||||
|
kprintf("%2d %016lx (+%4ld) %016lx\n", callIndex, rbp,
|
||||||
|
frame->rbp - rbp, frame->rip);
|
||||||
|
|
||||||
kprintf("%2d %016lx (+%4ld) %016lx\n", callIndex, rbp,
|
rbp = frame->rbp;
|
||||||
(addr_t)frame->previous - rbp, frame->return_address);
|
} else {
|
||||||
|
stack_frame* frame = (stack_frame*)rbp;
|
||||||
|
if (frame->return_address == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
rbp = (addr_t)frame->previous;
|
kprintf("%2d %016lx (+%4ld) %016lx\n", callIndex, rbp,
|
||||||
|
(frame->previous != NULL)
|
||||||
|
? (addr_t)frame->previous - rbp : 0,
|
||||||
|
frame->return_address);
|
||||||
|
|
||||||
|
rbp = (addr_t)frame->previous;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user