vppinfra: support libunwind for backtrace 21/40921/2
authorGuillaume Solignac <gsoligna@cisco.com>
Thu, 23 May 2024 09:59:53 +0000 (11:59 +0200)
committerGuillaume Solignac <gsoligna@cisco.com>
Thu, 23 May 2024 11:56:28 +0000 (13:56 +0200)
On non-glibc systems, execinfo is the only option available, but the lib
is old and can crash when unwinding. We now can use libunwind to unroll
it instead of using execinfo.h.

Type: improvement
Signed-off-by: Guillaume Solignac <gsoligna@cisco.com>
Change-Id: I8b55f7aca97261a2efb5dca998889d5e0645939a

src/vppinfra/CMakeLists.txt
src/vppinfra/backtrace.c

index 154e3a7..a8c64a3 100644 (file)
@@ -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}
index e713bae..bae563d 100644 (file)
@@ -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)