aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vppinfra/CMakeLists.txt4
-rw-r--r--src/vppinfra/backtrace.c9
2 files changed, 13 insertions, 0 deletions
diff --git a/src/vppinfra/CMakeLists.txt b/src/vppinfra/CMakeLists.txt
index 154e3a77cb1..a8c64a36121 100644
--- a/src/vppinfra/CMakeLists.txt
+++ b/src/vppinfra/CMakeLists.txt
@@ -234,9 +234,13 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD")
else()
option(VPP_USE_EXTERNAL_LIBEXECINFO "Use external libexecinfo (useful for non-glibc targets)." OFF)
endif()
+option(VPP_USE_LIBUNWIND "Use libunwind for backtrace." OFF)
if(VPP_USE_EXTERNAL_LIBEXECINFO)
set(EXECINFO_LIB execinfo)
+elseif(VPP_USE_LIBUNWIND)
+ set(EXECINFO_LIB unwind)
+ add_compile_definitions(USE_LIBUNWIND)
endif()
add_vpp_library(vppinfra
SOURCES ${VPPINFRA_SRCS}
diff --git a/src/vppinfra/backtrace.c b/src/vppinfra/backtrace.c
index e713bae6876..bae563d04b0 100644
--- a/src/vppinfra/backtrace.c
+++ b/src/vppinfra/backtrace.c
@@ -219,8 +219,17 @@ backtrace_done:
#ifndef clib_backtrace_defined
#define clib_backtrace_defined
+#ifndef USE_LIBUNWIND
/* use glibc backtrace for stack trace */
#include <execinfo.h>
+#else
+#include <libunwind.h>
+static int
+backtrace (void **buffer, int size)
+{
+ return unw_backtrace (buffer, size);
+}
+#endif
__clib_export uword
clib_backtrace (uword * callers, uword max_callers, uword n_frames_to_skip)