From ad1e4ca334b26b3a579e146ff9e22bd4061700d6 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sun, 4 Sep 2022 22:01:09 +0100 Subject: [PATCH] Crashlog: Windows: Add BFD inline info support --- src/os/windows/crashlog_win.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index 440f9b18ce..dd2e2ef16d 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -548,6 +548,27 @@ char *CrashLogWindows::AppendDecodedStacktrace(char *buffer, const char *last) c if (bfd_info.file_name != nullptr) { buffer += seprintf(buffer, last, " (%s:%d)", bfd_info.file_name, bfd_info.line); } + if (bfd_info.found && bfd_info.abfd) { + const char *file_name = nullptr; + const char *func_name = nullptr; + uint line_num = 0; + while (bfd_find_inliner_info(bfd_info.abfd, &file_name, &func_name, &line_num)) { + buffer += seprintf(buffer, last, "\n[inlined]%*s", (int)(19 + (sizeof(void *) * 2)), ""); + if (func_name) { + int status = -1; + char *demangled = nullptr; +#if defined(WITH_DEMANGLE) + demangled = abi::__cxa_demangle(func_name, nullptr, 0, &status); +#endif + const char *name = (demangled != nullptr && status == 0) ? demangled : func_name; + buffer += seprintf(buffer, last, " %s", name); + free(demangled); + } + if (file_name != nullptr) { + buffer += seprintf(buffer, last, " (%s:%u)", file_name, line_num); + } + } + } #endif } buffer += seprintf(buffer, last, "\n");