Переглянути джерело

UserspaceEmulator: Add Emulator::dump_backtrace()

This gives you a nice, symbolicated backtrace at the current EIP. :^)
Andreas Kling 5 роки тому
батько
коміт
ddf7b817df

+ 20 - 0
DevTools/UserspaceEmulator/Emulator.cpp

@@ -178,6 +178,25 @@ int Emulator::exec()
     return m_exit_status;
 }
 
+void Emulator::dump_backtrace()
+{
+    u32 offset = 0;
+    String symbol = m_elf->symbolicate(m_cpu.eip(), &offset);
+
+    printf("> %#08x  %s +%#x\n", m_cpu.eip(), symbol.characters(), offset);
+
+    u32 frame_ptr = m_cpu.ebp();
+    while (frame_ptr) {
+        u32 ret_ptr = m_mmu.read32({ 0x20, frame_ptr + 4 });
+        if (!ret_ptr)
+            return;
+        symbol = m_elf->symbolicate(ret_ptr, &offset);
+        printf("> %#08x  %s +%#x\n", ret_ptr, symbol.characters(), offset);
+
+        frame_ptr = m_mmu.read32({ 0x20, frame_ptr });
+    }
+}
+
 u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3)
 {
     (void)arg2;
@@ -198,6 +217,7 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3)
         return 0;
     default:
         warn() << "Unimplemented syscall!";
+        dump_backtrace();
         TODO();
     }
 }

+ 1 - 0
DevTools/UserspaceEmulator/Emulator.h

@@ -40,6 +40,7 @@ public:
     explicit Emulator(NonnullRefPtr<ELF::Loader>);
 
     bool load_elf();
+    void dump_backtrace();
 
     int exec();
     u32 virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3);