Kernel: Symbolicate the crash address too, not just the call stack.

Also print it in shiny red to make it extra easy to spot. :^)
Fixes #244.
This commit is contained in:
Andreas Kling 2019-06-19 18:50:02 +02:00
parent c5d623e048
commit 15bea7153a
Notes: sideshowbarker 2024-07-19 13:32:52 +09:00
3 changed files with 11 additions and 7 deletions

View File

@ -171,14 +171,14 @@ void exception_6_handler(RegisterDump& regs)
current->pid());
dump(regs);
dump_backtrace();
if (current->process().is_ring0()) {
kprintf("Oh shit, we've crashed in ring 0 :(\n");
dump_backtrace();
hang();
}
current->process().crash(SIGILL);
current->process().crash(SIGILL, regs.eip);
}
// 7: FPU not available exception
@ -224,10 +224,11 @@ void exception_0_handler(RegisterDump& regs)
if (current->process().is_ring0()) {
kprintf("Oh shit, we've crashed in ring 0 :(\n");
dump_backtrace();
hang();
}
current->process().crash(SIGFPE);
current->process().crash(SIGFPE, regs.eip);
}
// 13: General Protection Fault
@ -240,10 +241,11 @@ void exception_13_handler(RegisterDumpWithExceptionCode& regs)
if (current->process().is_ring0()) {
kprintf("Oh shit, we've crashed in ring 0 :(\n");
dump_backtrace();
hang();
}
current->process().crash();
current->process().crash(SIGSEGV, regs.eip);
}
// 14: Page Fault
@ -285,7 +287,7 @@ void exception_14_handler(RegisterDumpWithExceptionCode& regs)
regs.exception_code & 2 ? "write" : "read",
faultAddress);
dump(regs);
current->process().crash();
current->process().crash(SIGSEGV, regs.eip);
} else if (response == PageFaultResponse::Continue) {
#ifdef PAGE_FAULT_DEBUG
dbgprintf("Continuing after resolved page fault\n");

View File

@ -740,11 +740,13 @@ void Process::sys$sigreturn()
ASSERT_NOT_REACHED();
}
void Process::crash(int signal)
void Process::crash(int signal, dword eip)
{
ASSERT_INTERRUPTS_DISABLED();
ASSERT(!is_dead());
if (m_elf_loader && ksyms_ready)
dbgprintf("\033[31;1m%p %s\033[0m\n", eip, m_elf_loader->symbolicate(eip).characters());
dump_backtrace();
m_termination_signal = signal;

View File

@ -204,7 +204,7 @@ public:
static void initialize();
[[noreturn]] void crash(int signal = SIGSEGV);
[[noreturn]] void crash(int signal, dword eip);
[[nodiscard]] static int reap(Process&);
const TTY* tty() const { return m_tty; }