aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrea <rea@FreeBSD.org>2014-12-22 22:50:46 +0800
committerrea <rea@FreeBSD.org>2014-12-22 22:50:46 +0800
commit2c0cda158e626db75e1f599a1a7e6362f29f632b (patch)
tree6cabfa93c1b97d3b1236025c14e8b2e0bc2c8cb9
parentc5c000f88cec2747484f7892889d6fae1768cefb (diff)
downloadfreebsd-ports-gnome-2c0cda158e626db75e1f599a1a7e6362f29f632b.tar.gz
freebsd-ports-gnome-2c0cda158e626db75e1f599a1a7e6362f29f632b.tar.zst
freebsd-ports-gnome-2c0cda158e626db75e1f599a1a7e6362f29f632b.zip
www/squid: implement proper backtrace support
Now Squid will print full backtrace for problematic cases when it is about to die on some signal and should emit stacktrace. You'll obviously need to compile it with STACKTRACES option. Tested at: KIAE Grid production Squid cluster MFC after: 1 week MFH: 2014Q4 Sponsored by: Kurchatov Institute of Atomic Energy
-rw-r--r--www/squid/Makefile5
-rw-r--r--www/squid/files/extra-patch-gen-stacktrace124
2 files changed, 128 insertions, 1 deletions
diff --git a/www/squid/Makefile b/www/squid/Makefile
index f0b421d1ebff..be714a2e6f6e 100644
--- a/www/squid/Makefile
+++ b/www/squid/Makefile
@@ -2,7 +2,7 @@
PORTNAME= squid
PORTVERSION= 3.4.10
-PORTREVISION= 1
+PORTREVISION= 2
CATEGORIES= www ipv6
MASTER_SITES= http://www.squid-cache.org/Versions/v3/${PORTVERSION:R}/ \
http://www2.us.squid-cache.org/Versions/v3/${PORTVERSION:R}/ \
@@ -97,6 +97,7 @@ SNMP_CONFIGURE_ENABLE= snmp
SSL_CONFIGURE_ENABLE= ssl
SSL_CRTD_CONFIGURE_ENABLE= ssl-crtd
STACKTRACES_CONFIGURE_ENABLE= stacktraces
+STACKTRACES_LIB_DEPENDS= libunwind.so:${PORTSDIR}/devel/libunwind
TP_IPFW_CONFIGURE_ENABLE= ipfw-transparent
TP_IPF_CONFIGURE_ENABLE= ipf-transparent
TP_PF_CONFIGURE_ENABLE= pf-transparent
@@ -300,7 +301,9 @@ LDFLAGS+= -L${OPENSSLLIB}
.if ${PORT_OPTIONS:MSTACKTRACES}
CFLAGS+= -g
+LDFLAGS+= -lunwind -L${LOCALBASE}/lib
STRIP=
+EXTRA_PATCHES+= ${FILESDIR}/extra-patch-gen-stacktrace
.endif
.if ${PORT_OPTIONS:MDEBUG} || defined(WITH_DEBUG)
diff --git a/www/squid/files/extra-patch-gen-stacktrace b/www/squid/files/extra-patch-gen-stacktrace
new file mode 100644
index 000000000000..81925e4e7136
--- /dev/null
+++ b/www/squid/files/extra-patch-gen-stacktrace
@@ -0,0 +1,124 @@
+--- src/tools.cc.orig 2014-10-31 12:36:43.000000000 +0300
++++ src/tools.cc 2014-11-21 14:11:25.000000000 +0300
+@@ -71,6 +71,13 @@
+ #include <errno.h>
+ #endif
+
++#if PRINT_STACK_TRACE
++#ifdef __FreeBSD__
++#define UNW_LOCAL_ONLY
++#include <libunwind.h>
++#endif
++#endif
++
+ #define DEAD_MSG "\
+ The Squid Cache (version %s) died.\n\
+ \n\
+@@ -411,6 +418,45 @@
+ }
+
+ #endif
++#ifdef __FreeBSD__
++ do {
++ unw_context_t unw_ctx;
++ unw_cursor_t unw_cp;
++ unw_word_t sp, ip, off;
++ int rc = 0;
++ char procname[256];
++ size_t frame;
++
++ bzero((void *)&unw_ctx, sizeof(unw_ctx));
++ bzero((void *)&unw_cp, sizeof(unw_cp));
++
++ if ((rc = unw_getcontext(&unw_ctx))) {
++ fprintf(debug_log, "Failed to trace own stack: "
++ "unw_context() said '%s'.\n", unw_strerror(rc));
++ break;
++ }
++ if ((rc = unw_init_local(&unw_cp, &unw_ctx))) {
++ fprintf(debug_log, "Failed to trace own stack: "
++ "unw_init_local() said '%s'.\n", unw_strerror(rc));
++ break;
++ }
++ frame = 0;
++ fprintf(debug_log, "Backtrace follows (deepest frame first):\n");
++ while ((rc = unw_step(&unw_cp)) > 0) {
++ frame++;
++ ip = 0; sp = 0;
++ unw_get_reg(&unw_cp, UNW_REG_IP, &ip);
++ unw_get_reg(&unw_cp, UNW_REG_SP, &sp);
++ off = 0;
++ rc = unw_get_proc_name(&unw_cp, procname, sizeof(procname), &off);
++ if (rc)
++ snprintf (procname, sizeof(procname), "[unknown]");
++ fprintf(debug_log, "#%zd: %s + 0x%zx, ip = 0x%zx, sp = 0x%zx\n",
++ frame, procname, (size_t)off, (size_t)ip, (size_t)sp);
++ }
++ fprintf(debug_log, "Use addr2line of similar to translate offsets to line information.\n");
++ } while (0);
++#endif /* __FreeBSD__ */
+ #endif /* PRINT_STACK_TRACE */
+
+ #if SA_RESETHAND == 0 && !_SQUID_WINDOWS_
+--- src/tools.cc.orig 2014-10-31 12:36:43.000000000 +0300
++++ src/tools.cc 2014-11-21 14:11:25.000000000 +0300
+@@ -71,6 +71,13 @@
+ #include <errno.h>
+ #endif
+
++#if PRINT_STACK_TRACE
++#ifdef __FreeBSD__
++#define UNW_LOCAL_ONLY
++#include <libunwind.h>
++#endif
++#endif
++
+ #define DEAD_MSG "\
+ The Squid Cache (version %s) died.\n\
+ \n\
+@@ -411,6 +418,45 @@
+ }
+
+ #endif
++#ifdef __FreeBSD__
++ do {
++ unw_context_t unw_ctx;
++ unw_cursor_t unw_cp;
++ unw_word_t sp, ip, off;
++ int rc = 0;
++ char procname[256];
++ size_t frame;
++
++ bzero((void *)&unw_ctx, sizeof(unw_ctx));
++ bzero((void *)&unw_cp, sizeof(unw_cp));
++
++ if ((rc = unw_getcontext(&unw_ctx))) {
++ fprintf(debug_log, "Failed to trace own stack: "
++ "unw_context() said '%s'.\n", unw_strerror(rc));
++ break;
++ }
++ if ((rc = unw_init_local(&unw_cp, &unw_ctx))) {
++ fprintf(debug_log, "Failed to trace own stack: "
++ "unw_init_local() said '%s'.\n", unw_strerror(rc));
++ break;
++ }
++ frame = 0;
++ fprintf(debug_log, "Backtrace follows (deepest frame first):\n");
++ while ((rc = unw_step(&unw_cp)) > 0) {
++ frame++;
++ ip = 0; sp = 0;
++ unw_get_reg(&unw_cp, UNW_REG_IP, &ip);
++ unw_get_reg(&unw_cp, UNW_REG_SP, &sp);
++ off = 0;
++ rc = unw_get_proc_name(&unw_cp, procname, sizeof(procname), &off);
++ if (rc)
++ snprintf (procname, sizeof(procname), "[unknown]");
++ fprintf(debug_log, "#%zd: %s + 0x%zx, ip = 0x%zx, sp = 0x%zx\n",
++ frame, procname, (size_t)off, (size_t)ip, (size_t)sp);
++ }
++ fprintf(debug_log, "Use addr2line of similar to translate offsets to line information.\n");
++ } while (0);
++#endif /* __FreeBSD__ */
+ #endif /* PRINT_STACK_TRACE */
+
+ #if SA_RESETHAND == 0 && !_SQUID_WINDOWS_