From 4e6fe3c14b13087c6f3e9a718adefa34fe029be7 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 18 Jan 2020 14:38:39 +0100 Subject: [PATCH] Kernel: Symbolicate kernel EIP on process crash Process::crash() was assuming that EIP was always inside the ELF binary of the program, but it could also be in the kernel. --- Kernel/Process.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index bcd59a775d..8ee398aa8d 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -1420,8 +1421,14 @@ void Process::crash(int signal, u32 eip) ASSERT(!is_dead()); ASSERT(¤t->process() == this); - if (m_elf_loader && ksyms_ready) + if (eip >= 0xc0000000 && ksyms_ready) { + auto* ksym = ksymbolicate(eip); + dbgprintf("\033[31;1m%p %s +%d\033[0m\n", eip, ksym ? demangle(ksym->name).characters() : "(k?)", ksym ? eip - ksym->address : 0); + } else if (m_elf_loader) { dbgprintf("\033[31;1m%p %s\033[0m\n", eip, m_elf_loader->symbolicate(eip).characters()); + } else { + dbgprintf("\033[31;1m%p (?)\033[0m\n", eip); + } dump_backtrace(); m_termination_signal = signal;