[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v8 12/20] xenctx: Add -d (--dump-as-stack) <daddr> option to dump memory at daddr as a stack.
Also switch from read_stack_word to read_mem_word since the provided address may not be aligned. Signed-off-by: Don Slutz <Don@xxxxxxxxxxxxxxx> --- tools/xentrace/xenctx.c | 70 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 18 deletions(-) diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c index 299ba5e..f6e5455 100644 --- a/tools/xentrace/xenctx.c +++ b/tools/xentrace/xenctx.c @@ -72,7 +72,9 @@ static struct xenctx { int all_vcpus; #ifndef NO_TRANSLATION guest_word_t mem_addr; + guest_word_t stk_addr; int do_memory; + int do_stack; #endif int self_paused; xc_dominfo_t dominfo; @@ -775,9 +777,7 @@ static int print_code(vcpu_guest_context_any_t *ctx, int vcpu) else printf("%02x ", *c); } - printf("\n"); - - printf("\n"); + printf("\n\n\n"); return 0; } @@ -787,9 +787,10 @@ static void print_stack_addr(guest_word_t addr, int width) printf(": "); } -static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) +static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width, + guest_word_t stk_addr_start) { - guest_word_t stack = stack_pointer(ctx); + guest_word_t stack = stk_addr_start; guest_word_t stack_limit; guest_word_t frame; guest_word_t word; @@ -798,11 +799,10 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) if ( width ) xenctx.bytes_per_line = ((xenctx.bytes_per_line + width - 1) / width) * width; - stack_limit = ((stack_pointer(ctx) + XC_PAGE_SIZE) + stack_limit = ((stack + XC_PAGE_SIZE) & ~((guest_word_t) XC_PAGE_SIZE - 1)); if ( xenctx.nr_stack_pages > 1 ) stack_limit += (xenctx.nr_stack_pages - 1) * XC_PAGE_SIZE; - printf("\n"); if ( xenctx.lines ) { printf("Stack:\n"); @@ -814,12 +814,15 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) printf("Stack Trace:\n"); else printf("Call Trace:\n"); - printf("%*s %c [<", width*2, "", xenctx.stack_trace ? '*' : ' '); - print_stack_word(instr_pointer(ctx), width); - printf(">]"); + if ( !xenctx.do_stack ) + { + printf("%*s %c [<", width*2, "", xenctx.stack_trace ? '*' : ' '); + print_stack_word(instr_pointer(ctx), width); + printf(">]"); - print_symbol(instr_pointer(ctx)); - printf(" <--\n"); + print_symbol(instr_pointer(ctx)); + printf(" <--\n"); + } if (xenctx.frame_ptrs) { stack = stack_pointer(ctx); frame = frame_pointer(ctx); @@ -866,12 +869,12 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) } } } else { - stack = stack_pointer(ctx); + stack = stk_addr_start; while(stack < stack_limit) { p = map_page(ctx, vcpu, stack); if (!p) return -1; - word = read_stack_word(p, width); + word = read_mem_word(ctx, vcpu, stack, width); if (is_kernel_text(word)) { print_stack_addr(stack, width); printf(" [<"); @@ -934,13 +937,19 @@ static void dump_ctx(int vcpu) print_mem(&ctx, vcpu, guest_word_size, xenctx.mem_addr); return; } + if ( xenctx.do_stack ) + { + print_stack(&ctx, vcpu, guest_word_size, xenctx.stk_addr); + return; + } #endif print_ctx(&ctx); #ifndef NO_TRANSLATION if (print_code(&ctx, vcpu)) return; if (is_kernel_text(instr_pointer(&ctx))) - if (print_stack(&ctx, vcpu, guest_word_size)) + if ( print_stack(&ctx, vcpu, guest_word_size, + stack_pointer(&ctx)) ) return; #endif } @@ -997,6 +1006,8 @@ static void usage(void) #ifndef NO_TRANSLATION printf(" -m maddr, --memory=maddr\n"); printf(" dump memory at maddr.\n"); + printf(" -d daddr, --dump-as-stack=daddr\n"); + printf(" dump memory as a stack at daddr.\n"); #endif } @@ -1007,7 +1018,7 @@ int main(int argc, char **argv) const char *prog = argv[0]; static const char *sopts = "fs:hak:SCn:b:l:Dt" #ifndef NO_TRANSLATION - "m:" + "m:d:" #endif ; static const struct option lopts[] = { @@ -1020,6 +1031,7 @@ int main(int argc, char **argv) {"tag-stack-dump", 0, NULL, 't'}, #ifndef NO_TRANSLATION {"memory", 1, NULL, 'm'}, + {"dump-as-stack", 1, NULL, 'd'}, #endif {"bytes-per-line", 1, NULL, 'b'}, {"lines", 1, NULL, 'l'}, @@ -1057,7 +1069,7 @@ int main(int argc, char **argv) { fprintf(stderr, "%s: Unsupported value(%d) for --display-stack-pages '%s'. Needs to be >= 1\n", - argv[0], xenctx.nr_stack_pages, optarg); + prog, xenctx.nr_stack_pages, optarg); exit(-1); } break; @@ -1106,6 +1118,11 @@ int main(int argc, char **argv) xenctx.do_memory = 1; do_default = 0; break; + case 'd': + xenctx.stk_addr = strtoull(optarg, NULL, 0); + xenctx.do_stack = 1; + do_default = 0; + break; #endif case 'h': usage(); @@ -1123,6 +1140,16 @@ int main(int argc, char **argv) exit(-1); } +#ifndef NO_TRANSLATION + if ( xenctx.frame_ptrs && xenctx.do_stack ) + { + fprintf(stderr, + "%s both --frame-pointers and --dump-as-stack is not supported\n", + prog); + exit(-1); + } +#endif + xenctx.domid = atoi(argv[0]); if (xenctx.domid==0) { fprintf(stderr, "cannot trace dom0\n"); @@ -1169,10 +1196,17 @@ int main(int argc, char **argv) if ( xenctx.do_memory ) { dump_ctx(vcpu); - if (xenctx.all_vcpus) + if ( xenctx.do_stack || xenctx.all_vcpus ) printf("\n"); } xenctx.do_memory = 0; + if ( xenctx.do_stack ) + { + dump_ctx(vcpu); + if ( xenctx.all_vcpus ) + printf("\n"); + } + xenctx.do_stack = 0; #endif if (xenctx.all_vcpus) dump_all_vcpus(); -- 1.8.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |