From mboxrd@z Thu Jan 1 00:00:00 1970 From: Don Slutz Subject: [PATCH v3 10/16] xenctx: Add command line option -T (--tag-call-trace) Date: Mon, 11 Nov 2013 13:15:16 -0500 Message-ID: <1384193722-2916-11-git-send-email-dslutz@terremark.com> References: <1384193722-2916-1-git-send-email-dslutz@terremark.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1384193722-2916-1-git-send-email-dslutz@terremark.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Ian Campbell , Stefano Stabellini , George Dunlap , Don Slutz , Ian Jackson , Jan Beulich List-Id: xen-devel@lists.xenproject.org From: Don Slutz If specified, add stack addr to call trace. Here is an example: Call Trace: [] default_idle+0x29 <-- ffffffff803ddf90: [] cpu_idle+0x95 ffffffff803ddfa0: [] start_kernel+0x220 ffffffff803ddfc0: [] x86_64_start_kernel+0x22f and Stack Trace: * [] default_idle+0x29 <-- ffffffff803ddf90: [] cpu_idle+0x95 ffffffff803ddf98: 0000000000200800 ffffffff803ddfa0: [] start_kernel+0x220 ffffffff803ddfa8: 0000000000086800 ffffffff803ddfb0: 0000000000000000 ffffffff803ddfb8: ffffffff80430720 ffffffff803ddfc0: [] x86_64_start_kernel+0x22f ffffffff803ddfc8: 80008e000010019c ffffffff803ddfd0: 00000000ffffffff ffffffff803ddfd8: 0000000000000000 ffffffff803ddfe0: 0000000000000000 ffffffff803ddfe8: 0000000000200000 ffffffff803ddff0: 0000000000000000 ffffffff803ddff8: 0000000000000000 Signed-off-by: Don Slutz --- Changed since v2: * Add command line option to control this. * More info in commit message. tools/xentrace/xenctx.c | 48 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c index 018e2fe..40e72f4 100644 --- a/tools/xentrace/xenctx.c +++ b/tools/xentrace/xenctx.c @@ -40,6 +40,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; @@ -711,6 +712,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(">]"); @@ -726,9 +729,14 @@ 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 { @@ -740,7 +748,12 @@ 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"); } @@ -751,7 +764,12 @@ 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); @@ -767,13 +785,23 @@ 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"); } @@ -874,13 +902,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-call-trace\n"); + printf(" add address on each line of Call trace.\n"); } int main(int argc, char **argv) { int ch; int ret; - static const char *sopts = "fs:hak:SC2b:l:Dt"; + static const char *sopts = "fs:hak:SC2b:l:DtT"; static const struct option lopts[] = { {"stack-trace", 0, NULL, 'S'}, {"symbol-table", 1, NULL, 's'}, @@ -889,6 +919,7 @@ int main(int argc, char **argv) {"two-pages", 0, NULL, '2'}, {"decode-as-ascii", 0, NULL, 'D'}, {"tag-stack-dump", 0, NULL, 't'}, + {"tag-call-trace", 0, NULL, 'T'}, {"bytes-per-line", 1, NULL, 'b'}, {"lines", 1, NULL, 'l'}, {"all", 0, NULL, 'a'}, @@ -926,6 +957,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