From 9ddf8c26e50067029fbee9072e2066567f3f29b1 Mon Sep 17 00:00:00 2001
|
From: Maksim Kita <maksim-kita@yandex-team.ru>
|
Date: Sun, 23 May 2021 10:27:29 +0000
|
Subject: [PATCH] libunwind: Added unw_backtrace method
|
|
Source: https://github.com/ClickHouse-Extras/libunwind/commit/52f0f7861926cbfaef7e6c97d8a6d7ba2a1f6747#diff-a82fc885e2e4facf4b92d26171c13aa4aa5db296f77e1158ba2f8664e3bd1f5c
|
Upstream-Status: Pending
|
Signed-off-by: Khem Raj <raj.khem@gmail.com>
|
---
|
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 0feecd7bd6fc..670cfa3ed71d 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 1faf000ce44a..1edbdea6a19e 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<void *>(static_cast<uintptr_t>(ip));
|
+ }
|
+
|
+ return current;
|
+}
|
|
// Add logging hooks in Debug builds only
|
#ifndef NDEBUG
|