diff options
author | hunt <hunt> | 2007-07-02 07:14:36 +0000 |
---|---|---|
committer | hunt <hunt> | 2007-07-02 07:14:36 +0000 |
commit | 8885da7591dad014c6815e25729d93c40624d7f1 (patch) | |
tree | e343e310fdc74572b418e425d7f83da99606b455 /runtime/stack-x86_64.c | |
parent | b5f107a1a125e58385341e2da7030bd73e92a922 (diff) | |
download | systemtap-steved-8885da7591dad014c6815e25729d93c40624d7f1.tar.gz systemtap-steved-8885da7591dad014c6815e25729d93c40624d7f1.tar.xz systemtap-steved-8885da7591dad014c6815e25729d93c40624d7f1.zip |
2007-07-02 Martin Hunt <hunt@redhat.com>
* sym.c (_stp_kallsyms_lookup): Improve heuristic
for determining when a pointer is in a function.
(_stp_func_print): New function.
* stack-i386.c, stack-x86_64.c: Remove obsolete
unwind code. Use _stp_func_print().
Diffstat (limited to 'runtime/stack-x86_64.c')
-rw-r--r-- | runtime/stack-x86_64.c | 54 |
1 files changed, 1 insertions, 53 deletions
diff --git a/runtime/stack-x86_64.c b/runtime/stack-x86_64.c index 15bac801..6f02e7ba 100644 --- a/runtime/stack-x86_64.c +++ b/runtime/stack-x86_64.c @@ -7,66 +7,14 @@ * Public License (GPL); either version 2, or (at your option) any * later version. */ -#ifdef CONFIG_STACK_UNWIND -#include <linux/unwind.h> - -static inline int _stp_valid_stack_ptr(struct unwind_frame_info *info) -{ - unsigned long context = (unsigned long)UNW_SP(info) & ~(THREAD_SIZE - 1); - unsigned long p = UNW_PC(info); - return p > context && p < context + THREAD_SIZE - 3; -} - -static int _stp_show_trace_unwind(struct unwind_frame_info *info, int verbose) -{ - int n = 0; - - while (unwind(info) == 0 && UNW_PC(info)) { - if (_stp_valid_stack_ptr(info)) - break; - n++; - if (verbose) { - _stp_print_char(' '); - _stp_symbol_print (UNW_PC(info)); - _stp_print_char('\n'); - } else - _stp_printf ("0x%016lx ", UNW_PC(info)); - if (arch_unw_user_mode(info)) - break; - } - return n; -} -#endif /* CONFIG_STACK_UNWIND */ static void __stp_stack_print (struct pt_regs *regs, int verbose, int levels) { unsigned long *stack = (unsigned long *)®_SP(regs); unsigned long addr; - int uw_ret = 0; - -#ifdef CONFIG_STACK_UNWIND - struct unwind_frame_info info; - if (unwind_init_frame_info(&info, current, regs) == 0) - uw_ret = _stp_show_trace_unwind(&info, verbose); - stack = (void *)UNW_SP(&info); -#endif - - if (uw_ret == 0) - _stp_print("Inexact backtrace:\n"); while ((long)stack & (THREAD_SIZE-1)) { addr = *stack++; - if (_stp_kta(addr)) { - if (verbose) { - if (uw_ret) { - uw_ret = 0; - _stp_print("Leftover inexact backtrace:\n"); - } - _stp_print_char(' '); - _stp_symbol_print(addr); - _stp_print_char('\n'); - } else - _stp_printf("0x%016lx ", addr); - } + _stp_func_print(addr, verbose); } } |