From 325bc981fef103448fa3c436466dfd0c51c0ef73 Mon Sep 17 00:00:00 2001 From: fslongjin Date: Thu, 23 Jun 2022 11:44:42 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8Dtraceback=E7=BB=88?= =?UTF-8?q?=E7=82=B9=E5=88=A4=E6=96=AD=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/debug/traceback/traceback.c | 8 +++++--- user/apps/shell/shell.c | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/kernel/debug/traceback/traceback.c b/kernel/debug/traceback/traceback.c index ba5e3154..eae80713 100644 --- a/kernel/debug/traceback/traceback.c +++ b/kernel/debug/traceback/traceback.c @@ -51,14 +51,16 @@ void traceback(struct pt_regs *regs) // 最大追踪10层调用栈 for (int i = 0; i < 10; ++i) { - printk_color(ORANGE, BLACK, "rbp:%#018lx,*rbp:%#018lx\n", rbp, *rbp); if (lookup_kallsyms(ret_addr, i) != 0) break; - // 由于内核栈大小32K,因此当前rbp的值为按照32K对齐时,表明调用栈已经到头了,追踪结束。 - if (((*rbp) & (~STACK_SIZE)) == 0) + // 当前栈帧的rbp的地址大于等于内核栈的rbp的时候,表明调用栈已经到头了,追踪结束。 + // 当前rbp的地址为用户空间时,直接退出 + if((uint64_t)(rbp) >= current_pcb->thread->rbp || ((uint64_t)rbprsp)) break; + printk_color(ORANGE, BLACK, "rbp:%#018lx,*rbp:%#018lx\n", rbp, *rbp); + // 由于x86处理器在执行call指令时,先将调用返回地址压入栈中,然后再把函数的rbp入栈,最后将rsp设为新的rbp。 // 因此,此处的rbp就是上一层的rsp,那么,*(rbp+1)得到的就是上一层函数的返回地址 ret_addr = *(rbp + 1); diff --git a/user/apps/shell/shell.c b/user/apps/shell/shell.c index 7d784256..c91be545 100644 --- a/user/apps/shell/shell.c +++ b/user/apps/shell/shell.c @@ -73,7 +73,7 @@ int main() int kb_fd = open(kb_file_path, 0); // printf("keyboard fd = %d\n", kb_fd); print_ascii_logo(); - int a = 1/0; + main_loop(kb_fd); while (1) ;