[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v5 11/17] 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 | 73 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 20 deletions(-) diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c index 13f56ed..f77f17e 100644 --- a/tools/xentrace/xenctx.c +++ b/tools/xentrace/xenctx.c @@ -71,7 +71,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; @@ -765,15 +767,13 @@ 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; } -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; @@ -781,11 +781,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.multiple_pages > 1 ) stack_limit += (xenctx.multiple_pages - 1) * XC_PAGE_SIZE; - printf("\n"); if ( xenctx.lines ) { printf("Stack:\n"); @@ -797,14 +796,17 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) printf("Stack Trace:\n"); else printf("Call Trace:\n"); - if ( xenctx.tag_call_trace ) - printf(" %*s", width*2, ""); - printf("%c [<", xenctx.stack_trace ? '*' : ' '); - print_stack_word(instr_pointer(ctx), width); - printf(">]"); - - print_symbol(instr_pointer(ctx)); - printf(" <--\n"); + if ( !xenctx.do_stack ) + { + if ( xenctx.tag_call_trace ) + printf(" %*s", width*2, ""); + printf("%c [<", xenctx.stack_trace ? '*' : ' '); + print_stack_word(instr_pointer(ctx), width); + printf(">]"); + + print_symbol(instr_pointer(ctx)); + printf(" <--\n"); + } if (xenctx.frame_ptrs) { stack = stack_pointer(ctx); frame = frame_pointer(ctx); @@ -866,12 +868,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)) { if ( xenctx.tag_call_trace ) { @@ -944,13 +946,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 } @@ -1007,6 +1015,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 } @@ -1015,7 +1025,7 @@ int main(int argc, char **argv) int ch; int ret; #ifndef NO_TRANSLATION - static const char *sopts = "fs:hak:SCn:b:l:DtTm:"; + static const char *sopts = "fs:hak:SCn:b:l:DtTm:d:"; #else static const char *sopts = "fs:hak:SCn:b:l:DtT"; #endif @@ -1030,6 +1040,7 @@ int main(int argc, char **argv) {"tag-trace", 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'}, @@ -1110,6 +1121,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(); @@ -1127,6 +1143,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", + argv[0]); + exit(-1); + } +#endif + xenctx.domid = atoi(argv[0]); if (xenctx.domid==0) { fprintf(stderr, "cannot trace dom0\n"); @@ -1164,10 +1190,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 |