[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v9 03/18] 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 downwards growing configured 3 page stack, and where the SP currently is. Each box is a page. + pages -n 1 -n 2 -n 3 End of Memory +------------------+ | | | | | | | | | | +------------------+ ... +------------------+ | | | | | | | | MAX+3 | | +------------------+ * | | | | | | | | | | | | MAX+2 | | | +------------------+ * | | | | | | | | | | | | | | | | | MAX+1 | | | | +------------------+ * | | | | | | | SP --> | | * * * | | | | MAX | | +------------------+ ... +------------------+ | | | | | | | | 0 | | +------------------+ 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. For example: $ xenctx -s /boot/System.map-2.6.32-279.2.1.el6.x86_64 3 1 -n 1 ... Call Trace: [<ffffffff81346898>] io_serial_out+0x18 <-- ffff880032bb1310: [<ffffffff81346f51>] serial8250_console_putchar+0x31 ffff880032bb1330: [<ffffffff813428de>] uart_console_write+0x3e ffff880032bb1338: [<ffffffff8100bc0e>] apic_timer_interrupt+0xe ffff880032bb1370: [<ffffffff813472ad>] serial8250_console_write+0xbd ffff880032bb13c0: [<ffffffff8106b8f5>] __call_console_drivers+0x75 ffff880032bb13f0: [<ffffffff8106b95a>] _call_console_drivers+0x4a ffff880032bb1410: [<ffffffff8106be6e>] release_console_sem+0x4e ffff880032bb1450: [<ffffffff8106c628>] vprintk+0x248 ffff880032bb14f0: [<ffffffff814fd363>] printk+0x41 $ xenctx -s /boot/System.map-2.6.32-279.2.1.el6.x86_64 3 1 -n 2 ... Call Trace: [<ffffffff81346898>] io_serial_out+0x18 <-- ffff880032bb1310: [<ffffffff81346f51>] serial8250_console_putchar+0x31 ffff880032bb1330: [<ffffffff813428de>] uart_console_write+0x3e ffff880032bb1338: [<ffffffff8100bc0e>] apic_timer_interrupt+0xe ffff880032bb1370: [<ffffffff813472ad>] serial8250_console_write+0xbd ffff880032bb13c0: [<ffffffff8106b8f5>] __call_console_drivers+0x75 ffff880032bb13f0: [<ffffffff8106b95a>] _call_console_drivers+0x4a ffff880032bb1410: [<ffffffff8106be6e>] release_console_sem+0x4e ffff880032bb1450: [<ffffffff8106c628>] vprintk+0x248 ffff880032bb14f0: [<ffffffff814fd363>] printk+0x41 $ xenctx -s /boot/System.map-2.6.32-279.2.1.el6.x86_64 3 1 -n 3 ... Call Trace: [<ffffffff81346898>] io_serial_out+0x18 <-- ffff880032bb1310: [<ffffffff81346f51>] serial8250_console_putchar+0x31 ffff880032bb1330: [<ffffffff813428de>] uart_console_write+0x3e ffff880032bb1338: [<ffffffff8100bc0e>] apic_timer_interrupt+0xe ffff880032bb1370: [<ffffffff813472ad>] serial8250_console_write+0xbd ffff880032bb13c0: [<ffffffff8106b8f5>] __call_console_drivers+0x75 ffff880032bb13f0: [<ffffffff8106b95a>] _call_console_drivers+0x4a ffff880032bb1410: [<ffffffff8106be6e>] release_console_sem+0x4e ffff880032bb1450: [<ffffffff8106c628>] vprintk+0x248 ffff880032bb14f0: [<ffffffff814fd363>] printk+0x41 ffff880032bb3f20: [<ffffffff8100204c>] do_one_initcall+0x3c ffff880032bb3f50: [<ffffffff810b0eb1>] sys_init_module+0xe1 ffff880032bb3f80: [<ffffffff8100b0f2>] system_call_fastpath+0x16 Signed-off-by: Don Slutz <Don@xxxxxxxxxxxxxxx> --- v9: Re-work commit message. tools/xentrace/xenctx.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c index 42a47f3..c3c33f1 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" @@ -663,7 +666,8 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) int i; stack_limit = ((stack_pointer(ctx) + XC_PAGE_SIZE) - & ~((guest_word_t) XC_PAGE_SIZE - 1)); + & ~((guest_word_t) XC_PAGE_SIZE - 1)) + + (xenctx.nr_stack_pages - 1) * XC_PAGE_SIZE; printf("\n"); printf("Stack:\n"); for (i=1; i<5 && stack < stack_limit; i++) { @@ -834,18 +838,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 +865,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 +881,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 |