mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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@CloudSwitch.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
1 parent
26df185075
commit
91450fc02b
1 file changed
+24
-2
+24
-2
@@ -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;
|
||||
|
||||