[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v8 03/20] xenctx: Add -n (--display-stack-pages) option to output larger stack



On 04/01/14 09:25, George Dunlap wrote:
On 04/01/2014 02:19 PM, Ian Campbell wrote:
On Thu, 2014-03-27 at 15:05 -0400, Don Slutz wrote:
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.

Stacks grow downwards on all of the architectures we support. Perhaps
that is why the rest of us find your diagrams so confusing?


I expect so.  I can flip the picture (and add relative address) to help.  I was 
basing
the layout to match the stack output:

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

Adding (my) boxes (note not fully to scale):

    
+------------------------------------------------------------------------------+
    |                                                                           
   |
    |                                                                           
   |
    |                                                                           
   |
    |                                                                           
   |
    |                                                                           
   |
    |                                                                           
   |
    |                     [<ffffffff81346898>] io_serial_out+0x18 <--           
   |
SP->| 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        
   |
    |                                                                           
   |
    
+------------------------------------------------------------------------------+



I drew my example to you the way I did for a reason.


Sorry, I did not notice that.


Also, should the other end of the *---* line from SP (the bottom in your
diagram above) not be aligned to a page boundary, after all -n works in
pages.


I am happy to do it either way.  I think of the page breaks to not be part of 
memory.



@@ -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;

The if here is still redundant.


Will drop.

      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");

Doesn't it go without saying that if you go off the bottom of the stack
you will get garbage?

Only if you know that the tool doesn't know where the end of the stack is.  (Although 
hopefully the wording, "Display N pages" should give you a hint.)

But what is "changes stack limit" supposed to mean?


Partly it is used in the next patch's usage output:

 -l <lines>, --lines <lines>
                     change the number of lines output for Stack. (default 5)
                     Can be specified as MAX.  Note: Fewer lines will be output
                     if stack limit reached.


And it was the best term I know of to say in a few words:

The output of stack starts at the current SP and stops when the
end of N page(s) is/are reached.

   -Don Slutz



 -George



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.