diff options
author | rea <rea@FreeBSD.org> | 2014-12-22 22:50:46 +0800 |
---|---|---|
committer | rea <rea@FreeBSD.org> | 2014-12-22 22:50:46 +0800 |
commit | 2c0cda158e626db75e1f599a1a7e6362f29f632b (patch) | |
tree | 6cabfa93c1b97d3b1236025c14e8b2e0bc2c8cb9 | |
parent | c5c000f88cec2747484f7892889d6fae1768cefb (diff) | |
download | freebsd-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/Makefile | 5 | ||||
-rw-r--r-- | www/squid/files/extra-patch-gen-stacktrace | 124 |
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_ |