|
[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 |