You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zy...@apache.org on 2012/02/28 18:34:43 UTC
git commit: TS-1109 stack dump may crash too
Updated Branches:
refs/heads/master 332a5d2fe -> ad6c4ab97
TS-1109 stack dump may crash too
this patch is tested to be working on rhel5 x86_64
Author: weijin
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/ad6c4ab9
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/ad6c4ab9
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/ad6c4ab9
Branch: refs/heads/master
Commit: ad6c4ab97ff150727660f66aa64b0fb57fd3d3f7
Parents: 332a5d2
Author: Zhao Yongming <mi...@gmail.com>
Authored: Wed Feb 29 01:13:18 2012 +0800
Committer: Zhao Yongming <mi...@gmail.com>
Committed: Wed Feb 29 01:31:05 2012 +0800
----------------------------------------------------------------------
CHANGES | 4 ++-
lib/ts/ink_stack_trace.cc | 69 ++-------------------------------------
2 files changed, 7 insertions(+), 66 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/ad6c4ab9/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 05727c7..a365d31 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,8 @@
-*- coding: utf-8 -*-
Changes with Apache Traffic Server 3.1.3
- *) [TS-1123] editline/readline conflicts when building on OSX.
+ *) [TS-1109] fix stack dump crashing
+
+ *) [TS-1123] editline/readline conflicts when building on OSX.
*) [TS-1116] Fixes for building the source with clang/lvm.
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/ad6c4ab9/lib/ts/ink_stack_trace.cc
----------------------------------------------------------------------
diff --git a/lib/ts/ink_stack_trace.cc b/lib/ts/ink_stack_trace.cc
index d11b032..57aa84a 100644
--- a/lib/ts/ink_stack_trace.cc
+++ b/lib/ts/ink_stack_trace.cc
@@ -34,67 +34,6 @@
#include <execinfo.h> /* for backtrace_symbols, etc. */
#include <signal.h>
-#if defined(linux)
-/* TODO: port this more correctly to non-Linux platforms. */
-#define HAVE_SIGCONTEXT
-#endif
-
-struct sigframe
-{
- char *pretcode;
- int sig;
-#ifdef HAVE_SIGCONTEXT
- struct sigcontext sc;
-#endif
-};
-
-static void
-ink_restore_signal_handler_frame(void **stack, int len, int signalhandler_frame)
-{
-#ifdef HAVE_SIGCONTEXT
- void **fp;
- int i;
- struct sigframe *sf;
- struct sigcontext *scxt;
-
-#if defined(__i386__)
- asm volatile ("movl %%ebp,%0":"=r" (fp));
-#elif defined(__x86_64__)
- asm volatile ("mov %%rbp,%0":"=r" (fp));
-#elif defined(__arm__)
- asm volatile ("mov %%r9,%0":"=r" (fp));
-#endif
- for (i = 0; i < signalhandler_frame; i++)
- fp = (void **) (*fp);
- sf = (struct sigframe *) (fp + 1);
- scxt = &(sf->sc);
-#if defined(__i386__)
- stack[signalhandler_frame + 1] = (void *) scxt->eip;
-#elif defined(__x86_64__)
- stack[signalhandler_frame + 1] = (void *) scxt->rip;
-#elif defined(__arm__)
- stack[signalhandler_frame + 1] = (void *) scxt->arm_ip;
-#endif
- for (i = signalhandler_frame + 2; i < len - 1; i++)
- stack[i] = stack[i + 1];
-#endif
-}
-
-int
-ink_stack_trace_get(void **stack, int len, int signalhandler_frame)
-{
- int btl, i;
- if ((btl = backtrace(stack, len)) > 0) {
- if (signalhandler_frame)
- ink_restore_signal_handler_frame(stack, btl, signalhandler_frame + 1);
- // remove the frame corresponding to ink_backtrace &
- // ink_stack_trace_get
- for (i = 0; i < btl - 2; i++)
- stack[i] = stack[i + 2];
- }
- return btl - 2;
-}
-
void
ink_stack_trace_dump(int sighandler_frame)
{
@@ -111,10 +50,10 @@ ink_stack_trace_dump(int sighandler_frame)
void *stack[INK_STACK_TRACE_MAX_LEVELS + 1];
memset(stack, 0, sizeof(stack));
- btl = ink_stack_trace_get(stack, INK_STACK_TRACE_MAX_LEVELS, sighandler_frame);
-
- // dump the backtrace to stderr
- backtrace_symbols_fd(stack, btl, 2);
+ if ((btl = backtrace(stack, INK_STACK_TRACE_MAX_LEVELS)) > 2) {
+ // dump the backtrace to stderr
+ backtrace_symbols_fd(stack + 2, btl - 2, 2);
+ }
}
#else /* !TS_HAS_BACKTRACE */