From 1a1c0d9875165c8f57e1f7f38dba0b76f34b4fdf Mon Sep 17 00:00:00 2001 From: Jeremy <51220084+jeremy-rifkin@users.noreply.github.com> Date: Sun, 2 Jul 2023 23:19:15 -0400 Subject: [PATCH] Fallback for to backtrace_syminfo for CPPTRACE_FULL_TRACE_WITH_LIBBACKTRACE too --- src/full/full_trace_with_libbacktrace.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/full/full_trace_with_libbacktrace.cpp b/src/full/full_trace_with_libbacktrace.cpp index 9f0ed74..00e283d 100644 --- a/src/full/full_trace_with_libbacktrace.cpp +++ b/src/full/full_trace_with_libbacktrace.cpp @@ -36,6 +36,11 @@ namespace cpptrace { return 0; } + void syminfo_callback(void* data, uintptr_t, const char* symbol, uintptr_t, uintptr_t) { + stacktrace_frame& frame = *static_cast(data); + frame.symbol = symbol ? symbol : ""; + } + void error_callback(void*, const char*, int) { // nothing for now } @@ -57,6 +62,18 @@ namespace cpptrace { skip++; // add one for this call trace_data data { frames, skip }; backtrace_full(get_backtrace_state(), 0, full_callback, error_callback, &data); + for(auto& frame : frames) { + if(frame.symbol.empty()) { + // fallback, try to at least recover the symbol name with backtrace_syminfo + backtrace_syminfo( + get_backtrace_state(), + reinterpret_cast(frame.address), + syminfo_callback, + error_callback, + &frame + ); + } + } return frames; } }