summaryrefslogtreecommitdiffstats
path: root/runtime/stack-x86_64.c
diff options
context:
space:
mode:
authorMartin Hunt <hunt@redhat.com>2008-04-15 21:46:36 -0400
committerMartin Hunt <hunt@redhat.com>2008-04-15 21:46:36 -0400
commit8a49d1d23c77033bf98fc7b139b37f83e3e0eb49 (patch)
treeef40e55d0be98abe137c6d174b5bdb8c40bb022c /runtime/stack-x86_64.c
parentd46ba57b8584a005b2b97d1e7a02004169670492 (diff)
downloadsystemtap-steved-8a49d1d23c77033bf98fc7b139b37f83e3e0eb49.tar.gz
systemtap-steved-8a49d1d23c77033bf98fc7b139b37f83e3e0eb49.tar.xz
systemtap-steved-8a49d1d23c77033bf98fc7b139b37f83e3e0eb49.zip
Count stack levels printed on x86_64 too.
Diffstat (limited to 'runtime/stack-x86_64.c')
-rw-r--r--runtime/stack-x86_64.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/runtime/stack-x86_64.c b/runtime/stack-x86_64.c
index c3b171ea..729b8a2a 100644
--- a/runtime/stack-x86_64.c
+++ b/runtime/stack-x86_64.c
@@ -9,16 +9,16 @@
*/
/* DWARF unwinder failed. Just dump intereting addresses on kernel stack. */
-static void _stp_stack_print_fallback(unsigned long stack, int verbose)
+static void _stp_stack_print_fallback(unsigned long stack, int verbose, int levels)
{
unsigned long addr;
- while (stack & (THREAD_SIZE - 1) &&
- !_stp_pbuf_full()) {
+ while (levels && stack & (THREAD_SIZE - 1)) {
if (unlikely(_stp_read_address(addr, (unsigned long *)stack, KERNEL_DS))) {
/* cannot access stack. give up. */
return;
}
- _stp_func_print(addr, verbose, 0);
+ if (_stp_func_print(addr, verbose, 0))
+ levels--;
stack++;
}
}
@@ -30,17 +30,18 @@ static void __stp_stack_print(struct pt_regs *regs, int verbose, int levels)
struct unwind_frame_info info;
arch_unw_init_frame_info(&info, regs);
- while (!arch_unw_user_mode(&info)) {
+ while (levels && !arch_unw_user_mode(&info)) {
int ret = unwind(&info);
dbug_unwind(1, "ret=%d PC=%lx SP=%lx\n", ret, UNW_PC(&info), UNW_SP(&info));
if (ret == 0) {
_stp_func_print(UNW_PC(&info), verbose, 1);
+ levels--;
continue;
}
/* If an error happened or we hit a kretprobe trampoline, use fallback backtrace */
/* FIXME: is there a way to unwind across kretprobe trampolines? */
if (ret < 0 || (ret > 0 && UNW_PC(&info) == _stp_kretprobe_trampoline))
- _stp_stack_print_fallback(UNW_SP(&info), verbose);
+ _stp_stack_print_fallback(UNW_SP(&info), verbose, levels);
break;
}
#else /* ! STP_USE_DWARF_UNWINDER */