From fc16b5331c2bbeebff22da0ee9b38bd0714b99c4 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 16 Dec 2025 05:19:45 +0200 Subject: [PATCH] LibC: Fix backtrace compilation Also dump backtrace on SIGABRT --- userspace/libraries/LibC/unistd.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/userspace/libraries/LibC/unistd.cpp b/userspace/libraries/LibC/unistd.cpp index 1144de43..33cace16 100644 --- a/userspace/libraries/LibC/unistd.cpp +++ b/userspace/libraries/LibC/unistd.cpp @@ -32,6 +32,11 @@ struct init_funcs_t extern "C" char** environ; #define DUMP_BACKTRACE 1 +#define DEMANGLE_BACKTRACE 0 + +#if DEMANGLE_BACKTRACE +#include +#endif static void __dump_backtrace(int, siginfo_t*, void*); @@ -136,8 +141,20 @@ static void __dump_symbol(int fd, const void* address) return; } +#if DEMANGLE_BACKTRACE + int status; + char* demangled = abi::__cxa_demangle(dli.dli_sname, nullptr, nullptr, &status); + const char* symbol_name = status ? dli.dli_sname : demangled; +#else + const char* symbol_name = dli.dli_sname; +#endif + const uintptr_t uptr_saddr = reinterpret_cast(dli.dli_saddr); dprintf(fd, " 0x%08" PRIxPTR " (%s) %s+0x%" PRIxPTR "\n", uptr_addr - uptr_fbase, dli.dli_fname, symbol_name, uptr_addr - uptr_saddr); + +#if DEMANGLE_BACKTRACE + free(demangled); +#endif } static void __dump_backtrace(int sig, siginfo_t* info, void* context) @@ -146,6 +163,7 @@ static void __dump_backtrace(int sig, siginfo_t* info, void* context) [](int signal) -> const char* { switch (signal) { + case SIGABRT: return "SIGABRT"; case SIGBUS: return "SIGBUS"; case SIGFPE: return "SIGFPE"; case SIGILL: return "SIGILL";