[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 12/16] xenctx: Add -d <daddr> option to dump memory at daddr as a stack.
From: Don Slutz <Don@xxxxxxxxxxxxxxx> 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> --- Changed since v2: * Do this patch after -m patch. * Reworked option handling to allow multiple actions to work. * Add check for NO_TRANSLATION where needed. * More info in commit message. tools/xentrace/xenctx.c | 72 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c index 98202f8..ee3dcb9 100644 --- a/tools/xentrace/xenctx.c +++ b/tools/xentrace/xenctx.c @@ -67,7 +67,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; @@ -728,15 +730,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; @@ -746,11 +746,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.two_pages) stack_limit += XC_PAGE_SIZE; - printf("\n"); if (xenctx.lines) { printf("Stack:\n"); for (i = 1; i < xenctx.lines + 1 && stack < stack_limit; i++) { @@ -762,11 +761,11 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) printf(":"); } while(stack < stack_limit && - stack < stack_pointer(ctx) + i * xenctx.bytes_per_line) { + stack < stk_addr_start + i * xenctx.bytes_per_line) { 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 (xenctx.decode_as_ascii) ascii[j++] = word; printf(" "); @@ -799,14 +798,16 @@ 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); @@ -865,12 +866,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) { print_stack_word(stack, width); @@ -943,13 +944,17 @@ 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 } @@ -1000,6 +1005,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 } @@ -1008,7 +1015,7 @@ int main(int argc, char **argv) int ch; int ret; #ifndef NO_TRANSLATION - static const char *sopts = "fs:hak:SC2b:l:DtTm:"; + static const char *sopts = "fs:hak:SC2b:l:DtTm:d:"; #else static const char *sopts = "fs:hak:SC2b:l:DtT"; #endif @@ -1023,6 +1030,7 @@ int main(int argc, char **argv) {"tag-call-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'}, @@ -1097,6 +1105,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(); @@ -1114,6 +1127,15 @@ 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"); @@ -1150,10 +1172,16 @@ int main(int argc, char **argv) #ifndef NO_TRANSLATION 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 |