diff options
-rw-r--r-- | src/vppinfra/CMakeLists.txt | 4 | ||||
-rw-r--r-- | src/vppinfra/backtrace.c | 9 |
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) |