From 9a405fbda01e40e18677207c7bbf32a549b0b32d Mon Sep 17 00:00:00 2001 From: Jun Yuan Tan Date: Tue, 9 Nov 2021 10:58:30 +0800 Subject: [PATCH 30/34] libunwind: Added unw_backtrace method Source: https://github.com/ClickHouse-Extras/libunwind/commit/52f0f7861926cbfaef7e6c97d8a6d7ba2a1f6747#diff-a82fc885e2e4facf4b92d26171c13aa4aa5db296f77e1158ba2f8664e3bd1f5c Rebased to LLVM 14.0.0 by Jun Yuan Tan Signed-off-by: Khem Raj Signed-off-by: Jun Yuan Tan --- libunwind/include/libunwind.h | 1 + libunwind/src/libunwind.cpp | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/libunwind/include/libunwind.h b/libunwind/include/libunwind.h index 5ba63e5b7e5b..c49172f87362 100644 --- a/libunwind/include/libunwind.h +++ b/libunwind/include/libunwind.h @@ -127,6 +127,7 @@ extern int unw_is_fpreg(unw_cursor_t *, unw_regnum_t) LIBUNWIND_AVAIL; extern int unw_is_signal_frame(unw_cursor_t *) LIBUNWIND_AVAIL; extern int unw_get_proc_name(unw_cursor_t *, char *, size_t, unw_word_t *) LIBUNWIND_AVAIL; //extern int unw_get_save_loc(unw_cursor_t*, int, unw_save_loc_t*); +extern int unw_backtrace(void **, int) LIBUNWIND_AVAIL; extern unw_addr_space_t unw_local_addr_space; diff --git a/libunwind/src/libunwind.cpp b/libunwind/src/libunwind.cpp index 93e1bc131f0c..7ae1a10092ab 100644 --- a/libunwind/src/libunwind.cpp +++ b/libunwind/src/libunwind.cpp @@ -295,7 +295,25 @@ void __unw_remove_dynamic_fde(unw_word_t fde) { #endif // defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND) #endif // !defined(__USING_SJLJ_EXCEPTIONS__) +int unw_backtrace(void **buffer, int size) { + unw_context_t context; + unw_cursor_t cursor; + if (unw_getcontext(&context) || unw_init_local(&cursor, &context)) { + return 0; + } + + unw_word_t ip; + int current = 0; + while (unw_step(&cursor) > 0) { + if (current >= size || unw_get_reg(&cursor, UNW_REG_IP, &ip)) { + break; + } + buffer[current++] = reinterpret_cast(static_cast(ip)); + } + + return current; +} // Add logging hooks in Debug builds only #ifndef NDEBUG -- 2.33.1