debug(kernel): #PF 打印 rbp 链回溯(崩溃帧 + 4 级返回地址)
devfs_directory.find 崩溃(cr2=0x0 写 NULL,rax=rsp=0x6f0 异常)说明调用链栈已被破坏。isr.s 新增 _fault_rbp 保存异常现场 rbp,idt.vp [PF] 分支打印 [STK] 链定位栈损坏源。
This commit is contained in:
1 parent
b1956ea722
commit
a85f826adf
2 files changed
+28
No files matched your search
@@ -124,6 +124,31 @@ def isrCommonhandler(interrupt: t.CInt):
|
||||
buf: t.CArray[t.CChar, 100]
|
||||
viperlib.snprintf(c.Addr(buf), 100, "[PF] cr2=0x%lx rip=0x%lx err=0x%lx rsp=0x%lx\n", cr2, fault_rip, fault_err, fault_rsp)
|
||||
serial.puts(buf)
|
||||
# [STK] rbp 链回溯(定位栈损坏源:崩溃帧 + 4 级调用链的返回地址)
|
||||
fr0: t.CUInt64T = 0
|
||||
fr1: t.CUInt64T = 0
|
||||
fr2: t.CUInt64T = 0
|
||||
fr3: t.CUInt64T = 0
|
||||
fr4: t.CUInt64T = 0
|
||||
c.Asm(f"""mov rax, [_fault_rbp]
|
||||
mov {c.AsmOut(fr0, t.ASM_DESCR.OUTPUT_REG)}, rax
|
||||
mov rax, [rax + 8]
|
||||
mov {c.AsmOut(fr1, t.ASM_DESCR.OUTPUT_REG)}, rax
|
||||
mov rax, [_fault_rbp]
|
||||
mov rax, [rax]
|
||||
mov {c.AsmOut(fr2, t.ASM_DESCR.OUTPUT_REG)}, rax
|
||||
mov rax, [rax + 8]
|
||||
mov {c.AsmOut(fr3, t.ASM_DESCR.OUTPUT_REG)}, rax
|
||||
mov rax, [_fault_rbp]
|
||||
mov rax, [rax]
|
||||
mov rax, [rax]
|
||||
mov rax, [rax + 8]
|
||||
mov {c.AsmOut(fr4, t.ASM_DESCR.OUTPUT_REG)}, rax""",
|
||||
op=[t.ASM_DESCR.CLOBBER_RAX])
|
||||
stk_buf: t.CArray[t.CChar, 160]
|
||||
viperlib.snprintf(c.Addr(stk_buf), 160, "[STK] rbp=0x%lx ret: 0x%lx 0x%lx 0x%lx 0x%lx\n",
|
||||
fr0, fr1, fr2, fr3, fr4)
|
||||
serial.puts(stk_buf)
|
||||
elif interrupt == 13:
|
||||
gp_rip: t.CUInt64T = 0
|
||||
gp_err: t.CUInt64T = 0
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
.comm _fault_rip, 8, 8
|
||||
.comm _fault_err, 8, 8
|
||||
.comm _fault_rsp, 8, 8
|
||||
.comm _fault_rbp, 8, 8
|
||||
|
||||
.section .text
|
||||
.intel_syntax noprefix
|
||||
@@ -96,6 +97,7 @@ isr\num\()_frame_ready:
|
||||
push rsi
|
||||
push rdi
|
||||
push rbp
|
||||
mov [_fault_rbp], rbp
|
||||
push r8
|
||||
push r9
|
||||
push r10
|
||||
@@ -279,6 +281,7 @@ isr\num\()_frame_ready:
|
||||
push rsi
|
||||
push rdi
|
||||
push rbp
|
||||
mov [_fault_rbp], rbp
|
||||
push r8
|
||||
push r9
|
||||
push r10
|
||||
|
||||
Reference in new issue
Block a user