[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v8 03/20] xenctx: Add -n (--display-stack-pages) option to output larger stack
Important: This is the stack size (also known as stack limit) to display not the configured stack size. Note: use with caution (easy to get garbage). Below is a pictures of a configured 3 page stack, and where the SP currently is. Each box is a page. -n 1 -n 2 -n 3 +------------------+ | | | | | | | | SP --> | | * * * +------------------+ | | | | | | | | | | | | | | | | | | | | * | +------------------+ | | | | | | | | | | | | | | | * +------------------+ Display using "-n 3" since the used stack pages is 3. At a different time, the SP may be in the 1st page and so "-n 3" will display garbage. Signed-off-by: Don Slutz <Don@xxxxxxxxxxxxxxx> --- v8: Reworked comment. multiple_pages => nr_stack_pages Changed usage output. Added range checking of option. tools/xentrace/xenctx.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c index 42a47f3..dd84013 100644 --- a/tools/xentrace/xenctx.c +++ b/tools/xentrace/xenctx.c @@ -35,11 +35,14 @@ static struct xenctx { int frame_ptrs; int stack_trace; int disp_all; + int nr_stack_pages; int all_vcpus; int self_paused; xc_dominfo_t dominfo; } xenctx; +#define DEFAULT_NR_STACK_PAGES 1 + #if defined (__i386__) || defined (__x86_64__) typedef unsigned long long guest_word_t; #define FMT_32B_WORD "%08llx" @@ -664,6 +667,8 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) stack_limit = ((stack_pointer(ctx) + 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"); printf("Stack:\n"); for (i=1; i<5 && stack < stack_limit; i++) { @@ -834,18 +839,24 @@ static void usage(void) kernel_start); printf(" -a, --all display more registers\n"); printf(" -C, --all-vcpus print info for all vcpus\n"); + printf(" -n PAGES, --display-stack-pages=PAGES\n"); + printf(" Display N pages from the stack pointer. (default %d)\n", + DEFAULT_NR_STACK_PAGES); + printf(" Changes stack limit. Note: use with caution (easy\n"); + printf(" to get garbage).\n"); } int main(int argc, char **argv) { int ch; int ret; - static const char *sopts = "fs:hak:SC"; + static const char *sopts = "fs:hak:SCn:"; static const struct option lopts[] = { {"stack-trace", 0, NULL, 'S'}, {"symbol-table", 1, NULL, 's'}, {"frame-pointers", 0, NULL, 'f'}, {"kernel-start", 1, NULL, 'k'}, + {"display-stack-pages", 0, NULL, 'n'}, {"all", 0, NULL, 'a'}, {"all-vcpus", 0, NULL, 'C'}, {"help", 0, NULL, 'h'}, @@ -855,6 +866,8 @@ int main(int argc, char **argv) int vcpu = 0; + xenctx.nr_stack_pages = DEFAULT_NR_STACK_PAGES; + while ((ch = getopt_long(argc, argv, sopts, lopts, NULL)) != -1) { switch(ch) { case 'f': @@ -869,6 +882,16 @@ int main(int argc, char **argv) case 'a': xenctx.disp_all = 1; break; + case 'n': + xenctx.nr_stack_pages = strtol(optarg, NULL, 0); + if ( xenctx.nr_stack_pages < 1) + { + fprintf(stderr, + "%s: Unsupported value(%d) for --display-stack-pages '%s'. Needs to be >= 1\n", + argv[0], xenctx.nr_stack_pages, optarg); + exit(-1); + } + break; case 'C': xenctx.all_vcpus = 1; break; -- 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 |