[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v5 09/17] xenctx: Add command line option -T (--tag-trace)
If specified, add stack addr to Call and Stack trace. Here is an example: Call Trace: [<ffffffff8006b2b0>] default_idle+0x29 <-- ffffffff803ddf90: [<ffffffff80048d19>] cpu_idle+0x95 ffffffff803ddfa0: [<ffffffff803e7801>] start_kernel+0x220 ffffffff803ddfc0: [<ffffffff803e722f>] x86_64_start_kernel+0x22f and Stack Trace: * [<ffffffff8006b2b0>] default_idle+0x29 <-- ffffffff803ddf90: [<ffffffff80048d19>] cpu_idle+0x95 ffffffff803ddf98: 0000000000200800 ffffffff803ddfa0: [<ffffffff803e7801>] start_kernel+0x220 ffffffff803ddfa8: 0000000000086800 ffffffff803ddfb0: 0000000000000000 ffffffff803ddfb8: ffffffff80430720 ffffffff803ddfc0: [<ffffffff803e722f>] x86_64_start_kernel+0x22f ffffffff803ddfc8: 80008e000010019c ffffffff803ddfd0: 00000000ffffffff ffffffff803ddfd8: 0000000000000000 ffffffff803ddfe0: 0000000000000000 ffffffff803ddfe8: 0000000000200000 ffffffff803ddff0: 0000000000000000 ffffffff803ddff8: 0000000000000000 Signed-off-by: Don Slutz <Don@xxxxxxxxxxxxxxx> --- v5: Adjust option name, usage. tools/xentrace/xenctx.c | 53 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c index 107e353..5732665 100644 --- a/tools/xentrace/xenctx.c +++ b/tools/xentrace/xenctx.c @@ -44,6 +44,7 @@ static struct xenctx { int lines; int decode_as_ascii; int tag_stack_dump; + int tag_call_trace; int all_vcpus; int self_paused; xc_dominfo_t dominfo; @@ -740,6 +741,8 @@ 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(">]"); @@ -755,9 +758,15 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) p = map_page(ctx, vcpu, stack); if (!p) return -1; - printf("| "); + if ( xenctx.tag_call_trace ) + { + print_stack_word(stack, width); + printf(": | "); + } else { + printf("| "); + } print_stack_word(read_stack_word(p, width), width); - printf(" \n"); + printf("\n"); stack += width; } } else { @@ -769,7 +778,13 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) return -1; frame = read_stack_word(p, width); if (xenctx.stack_trace) { - printf("|-- "); + if ( xenctx.tag_call_trace ) + { + print_stack_word(stack, width); + printf(": |-- "); + } else { + printf("|-- "); + } print_stack_word(read_stack_word(p, width), width); printf("\n"); } @@ -780,7 +795,13 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) if (!p) return -1; word = read_stack_word(p, width); - printf("%c [<", xenctx.stack_trace ? '|' : ' '); + if ( xenctx.tag_call_trace ) + { + print_stack_word(stack, width); + printf(": %c [<", xenctx.stack_trace ? '|' : ' '); + } else { + printf("%c [<", xenctx.stack_trace ? '|' : ' '); + } print_stack_word(word, width); printf(">]"); print_symbol(word); @@ -796,13 +817,25 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) return -1; word = read_stack_word(p, width); if (is_kernel_text(word)) { - printf(" [<"); + if ( xenctx.tag_call_trace ) + { + print_stack_word(stack, width); + printf(": [<"); + } else { + printf(" [<"); + } print_stack_word(word, width); printf(">]"); print_symbol(word); printf("\n"); } else if (xenctx.stack_trace) { - printf(" "); + if ( xenctx.tag_call_trace ) + { + print_stack_word(stack, width); + printf(": "); + } else { + printf(" "); + } print_stack_word(word, width); printf("\n"); } @@ -906,13 +939,15 @@ static void usage(void) printf(" add a decode of Stack dump as ascii.\n"); printf(" -t, --tag-stack-dump\n"); printf(" add address on each line of Stack dump.\n"); + printf(" -T, --tag-trace\n"); + printf(" add address on each line of Call or Stack trace.\n"); } int main(int argc, char **argv) { int ch; int ret; - static const char *sopts = "fs:hak:SCn:b:l:Dt"; + static const char *sopts = "fs:hak:SCn:b:l:DtT"; static const struct option lopts[] = { {"stack-trace", 0, NULL, 'S'}, {"symbol-table", 1, NULL, 's'}, @@ -921,6 +956,7 @@ int main(int argc, char **argv) {"display-stack-pages", 0, NULL, 'n'}, {"decode-as-ascii", 0, NULL, 'D'}, {"tag-stack-dump", 0, NULL, 't'}, + {"tag-trace", 0, NULL, 'T'}, {"bytes-per-line", 1, NULL, 'b'}, {"lines", 1, NULL, 'l'}, {"all", 0, NULL, 'a'}, @@ -958,6 +994,9 @@ int main(int argc, char **argv) case 't': xenctx.tag_stack_dump = 1; break; + case 'T': + xenctx.tag_call_trace = 1; + break; case 'b': xenctx.bytes_per_line = strtol(optarg, NULL, 0); if ( xenctx.bytes_per_line < 4 || -- 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 |