[master] 8db414a50 Offer a configure --with-unwind switch

guillaume quintard gquintard at users.noreply.github.com
Fri Sep 27 20:41:06 UTC 2019


commit 8db414a5020f3a5974ff461eeba5fb669a3eaf7c
Author: Guillaume Quintard <guillaume at varnish-software.com>
Date:   Wed Sep 4 11:02:12 2019 +0900

    Offer a configure --with-unwind switch

diff --git a/.travis.yml b/.travis.yml
index 5de9b6b3b..b68503157 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -18,9 +18,10 @@ jobs:
             - nghttp2
             - python3-docutils
             - python3-sphinx
+            - libunwind-dev
       before_script:
         - ./autogen.sh
-        - ./configure
+        - ./configure --with-unwind
       script: &script-common
         - |
           if [[ "$TRAVIS_PULL_REQUEST" != "false" ]]; then
@@ -51,7 +52,7 @@ jobs:
           export UBSAN_OPTIONS=halt_on_error=1,print_stacktrace=1,use_sigaltstack=0,suppressions=$(pwd)/tools/ubsan.suppr
           export CC=clang-8
         - ./autogen.sh
-        - ./configure --enable-developer-warnings --enable-debugging-symbols --disable-stack-protector --with-persistent-storage --enable-asan --enable-ubsan
+        - ./configure --with-unwind --enable-developer-warnings --enable-debugging-symbols --disable-stack-protector --with-persistent-storage --enable-asan --enable-ubsan
     - stage: test
       os: osx
       osx_image: xcode10.2
@@ -80,7 +81,7 @@ jobs:
         - export PATH=$PATH:$(echo $(pwd)/cov-analysis-*/bin)
       script:
         - ./autogen.sh
-        - ./configure
+        - ./configure --with-unwind
         - cov-build --dir cov-int make
         - tar cfz varnish.tgz cov-int
         - curl --form token="$COVTOKEN"
diff --git a/bin/varnishd/Makefile.am b/bin/varnishd/Makefile.am
index 41fffd334..2a66a4e44 100644
--- a/bin/varnishd/Makefile.am
+++ b/bin/varnishd/Makefile.am
@@ -177,6 +177,11 @@ varnishd_LDADD = \
 	@PCRE_LIBS@ \
 	${DL_LIBS} ${PTHREAD_LIBS} ${NET_LIBS} ${RT_LIBS} ${LIBM}
 
+if WITH_UNWIND
+varnishd_CFLAGS += -DUNW_LOCAL_ONLY
+varnishd_LDADD += ${LIBUNWIND_LIBS}
+endif
+
 noinst_PROGRAMS = vhp_gen_hufdec
 vhp_gen_hufdec_SOURCES = hpack/vhp_gen_hufdec.c
 vhp_gen_hufdec_CFLAGS = @SAN_CFLAGS@ \
diff --git a/bin/varnishd/cache/cache_panic.c b/bin/varnishd/cache/cache_panic.c
index c45dfc4c0..cd4cfc482 100644
--- a/bin/varnishd/cache/cache_panic.c
+++ b/bin/varnishd/cache/cache_panic.c
@@ -29,7 +29,11 @@
 
 #include "config.h"
 
+#ifdef WITH_UNWIND
+#include <libunwind.h>
+#else
 #include <execinfo.h>
+#endif
 #include <stdio.h>
 #include <stdlib.h>
 #include <signal.h>
@@ -609,6 +613,47 @@ pan_sess(struct vsb *vsb, const struct sess *sp)
 
 /*--------------------------------------------------------------------*/
 
+#ifdef WITH_UNWIND
+
+static void
+pan_backtrace(struct vsb *vsb)
+{
+	unw_cursor_t cursor; unw_context_t uc;
+	unw_word_t ip, sp;
+	unw_word_t offp;
+	char fname[1024];
+	int ret;
+
+	VSB_printf(vsb, "Backtrace:\n");
+	VSB_indent(vsb, 2);
+
+	ret = unw_getcontext(&uc);
+	if (ret != 0) {
+		VSB_printf(vsb, "Backtrace not available "
+		    "(unw_getcontext returned %d)\n", ret);
+		return;
+	}
+	unw_init_local(&cursor, &uc);
+	if (ret != 0) {
+		VSB_printf(vsb, "Backtrace not available "
+		    "(unw_init_local returned %d)\n", ret);
+		return;
+	}
+	while (unw_step(&cursor) > 0) {
+		fname[0] = '\0';
+		ip = sp = 0;
+		unw_get_reg(&cursor, UNW_REG_IP, &ip);
+		unw_get_reg(&cursor, UNW_REG_SP, &sp);
+		unw_get_proc_name(&cursor, fname, sizeof(fname), &offp);
+		VSB_printf(vsb, "ip=0x%lx, sp=0x%lx <%s+0x%lx>\n", (long) ip,
+		    (long) sp, fname[0] ? fname : "???", offp);
+	}
+
+	VSB_indent(vsb, -2);
+}
+
+#else /* WITH_UNWIND */
+
 #define BACKTRACE_LEVELS	10
 
 static void
@@ -651,6 +696,8 @@ pan_backtrace(struct vsb *vsb)
 	VSB_indent(vsb, -2);
 }
 
+#endif /* WITH_UNWIND */
+
 #ifdef HAVE_PTHREAD_GETATTR_NP
 static void
 pan_threadattr(struct vsb *vsb)
diff --git a/configure.ac b/configure.ac
index 6d52fbb5b..c5b5930cc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -342,9 +342,25 @@ esac
 AC_SUBST(JEMALLOC_LDADD)
 
 AC_CHECK_FUNCS([setproctitle])
-AC_SEARCH_LIBS(backtrace, [execinfo], [], [
-   AC_MSG_ERROR([Could not find backtrace() support])
-])
+
+# if the default libexecinfo on alpine causes issues, you can use libunwind
+AC_ARG_WITH([unwind],
+            [AS_HELP_STRING([--with-unwind],
+              [use libunwind to print stacktraces (use libexecinfo otherwise). Recommended on alpine linux. Defaults to no.])])
+
+if test "$with_unwind" = yes; then
+    PKG_CHECK_MODULES([LIBUNWIND], [libunwind])
+    AC_DEFINE([WITH_UNWIND], [1],
+              [Define to 1 to use libunwind instead of libexecinfo])
+else
+    AC_SEARCH_LIBS(backtrace, [execinfo], [], [
+        AC_MSG_ERROR([Could not find backtrace() support])
+    ])
+fi
+
+AM_CONDITIONAL([WITH_UNWIND],
+	[test "$with_unwind" = yes])
+
 # white lie - we don't actually test it
 AC_MSG_CHECKING([whether daemon() works])
 case $target in
diff --git a/doc/changes.rst b/doc/changes.rst
index 06ebc0630..20b06c751 100644
--- a/doc/changes.rst
+++ b/doc/changes.rst
@@ -32,6 +32,11 @@ NEXT (2020-03-15)
 
 * The ``MAIN.sess_drop`` counter is gone.
 
+* New configure switch: --with-unwind. Alpine linux appears to offer a
+  `libexecinfo` implementation that crashes when called by Varnish, this
+  offers the alternative of using `libunwind` instead.
+
+
 ================================
 Varnish Cache 6.3.0 (2019-09-15)
 ================================


More information about the varnish-commit mailing list