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 */