svn commit: r375240 - in head/www/squid: . files
Eygene Ryabinkin
rea at FreeBSD.org
Mon Dec 22 14:50:48 UTC 2014
Author: rea
Date: Mon Dec 22 14:50:46 2014
New Revision: 375240
URL: https://svnweb.freebsd.org/changeset/ports/375240
QAT: https://qat.redports.org/buildarchive/r375240/
Log:
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
Added:
head/www/squid/files/extra-patch-gen-stacktrace (contents, props changed)
Modified:
head/www/squid/Makefile
Modified: head/www/squid/Makefile
==============================================================================
--- head/www/squid/Makefile Mon Dec 22 14:36:52 2014 (r375239)
+++ head/www/squid/Makefile Mon Dec 22 14:50:46 2014 (r375240)
@@ -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)
Added: head/www/squid/files/extra-patch-gen-stacktrace
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/www/squid/files/extra-patch-gen-stacktrace Mon Dec 22 14:50:46 2014 (r375240)
@@ -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_
More information about the svn-ports-head
mailing list