On Tue, Jun 14, 2016 at 04:56:43PM -0400, Dave Wysochanski wrote:
On Mon, 2016-06-13 at 11:30 -0400, Dave Anderson wrote:
>
> ----- Original Message -----
> > Dave,
> >
> > On Fri, Jun 10, 2016 at 04:37:42PM -0400, Dave Anderson wrote:
> > > Hi Takahiro,
> > >
> > > To address my concerns about your patch, I added a few additional changes
and attached
> > > it to this email. The changes are:
> > >
> > > (1) Prevent the stack dump "below" the #0 level. Yes, the stack
data region is contained within
> > > the incoming frame parameters, but it's ugly and we really
don't care to see what's before
> > > the #0 crash_kexec and crash_save_cpu #0 frames.
> > > (2) Fill in the missing stack dump at the top of the process stack, up to,
but not including
> > > the user-space exception frame.
> > > (3) Instead of showing the fp of 0 in the top-most frame's stack
address, fill it in with the
> > > address of the user-space exception frame.
> > >
> > > Note that there is no dump of the stack containing the user-space
exception frame, but the
> > > register dump itself should suffice.
> >
> > Well, the essential problem with my patch is that the output from "bt
-f"
> > looks like:
> > #XX ['fp'] 'function' at 'pc' --- (1)
> > <function's stack dump> --- (2)
> > but that (1) and (2) are not printed as a single stack frame in the same
> > iteration of while loop in arm64_back_trace_cmd().
> > (I hope you understand what I mean :)
>
> Actually I prefer your first approach. I find this new one confusing, not
> to mention unlike any of the other architectures in that the "frame
level"
> #X address value is not contiguous with the stack addresses that get filled
> in by -f.
>
> Taking your picture into account:
>
> stack grows to lower addresses.
> /|\
> |
> | |
> new sp +------+ <---
> |dyn | |
> | vars | |
> new fp +- - - + |
> |old fp| | a function's stack frame
> |old lr| |
> |static| |
> | vars| |
> old sp +------+ <---
> |dyn |
> | vars |
> old fp +------+
> | |
>
> Your first patch seemed natural to me because for any "#X" line containing
a function
> name, that function's dynamic variables, the "old fp/old lr" pair, and
the function's
> static variables were dumped below it (i.e., at higher stack addresses).
>
>
> > To be consistent with the out format of x86, the output should be
> > <function's stack dump>
> > #XX ['fp'] 'function' at 'pc'
> >
> > Unfortunately, this requires that arm64_back_trace_cmd() and other functions
should be overhauled.
> > Please take a look at my next patch though it is uncompleted and still has room
for improvement.
>
> I don't know what you mean by "consistent with the out format of x86"?
With x86_64,
> each #<level> line is simply the stack address where the function pushed its
return
> address as a result of its making a "callq" to the next function. Any
local variables of
> the calling function would be at the next higher stack addresses:
>
I've been confused by the address in []'s on arm64. Is this supposed to
be the stack address where the return address is stored, or does it vary
by arch?
A stack usage will vary from arch to arch.
On x86_64 (crash-7.1.4-1.el6_6):
crash> bt | grep " vfs_read at "
#5 [ffff89b6e510ff08] vfs_read at ffffffff811dea1c
crash> rd ffff89b6e510ff08
ffff89b6e510ff08: ffffffff811dea1c ........
I'm not quite familiar with other archs, but an example of
"crash> bt -f 1592" in "crash> help bt" doesn't match with
your case above neither.
On arm64 (crash-7.1.5-1.el7.aarch64) this isn't the case:
crash> bt | grep " vfs_read at "
#7 [ffff80015b93fdb0] vfs_read at ffff800000236b0c
crash> rd ffff80015b93fdb0
ffff80015b93fdb0: ffff80015c92e100 ...\....
Nor on arm64.
Please take a look at an ascii art in my previous e-mail, which
illustrates a stack usage on arm64.
Thanks,
-Takahiro AKASHI
> ...
> #X [stack address] function2 at 'return address'
> <function2's local variables>
> #Y [stack address] function1 at 'return address'
> <functions1's local variables>
> ...
>
> So for digging out local stack variables associated with a function, it's a
simple
> matter of looking "below" it in the "bt -f" output.
>
> Dave
>
>
> > Thanks,
> > -Takahiro AKASHI
> >
> >
> > > If you can live with the display, I'll clean up the patch, and maybe
add
> > > the stack-layout diagram
> > > from your last post into a comment. It was quite helpful, especially in
> > > comparison to the
> > > x86_64 model, which is what I was mistakenly using as a guide.
> > >
> > > Thanks,
> > > Dave
> > >
> > >
> > >
> >
> > > diff --git a/arm64.c b/arm64.c
> > > index 86ec348..3b29ef4 100644
> > > --- a/arm64.c
> > > +++ b/arm64.c
> > > @@ -1407,13 +1407,14 @@ arm64_print_stackframe_entry(struct bt_info *bt,
> > > int level, struct arm64_stackfr
> > > value_to_symstr(frame->pc, buf,
> > > bt->radix);
> > > }
> > >
> > > - if (bt->flags & BT_FULL) {
> > > - arm64_display_full_frame(bt, frame->sp);
> > > - bt->frameptr = frame->sp;
> > > + if ((bt->flags & BT_FULL) && level) {
> > > + arm64_display_full_frame(bt, frame->fp);
> > > + bt->frameptr = frame->fp;
> > > }
> > >
> > > fprintf(ofp, "%s#%d [%8lx] %s at %lx", level < 10 ?
" " : "",
> > > level,
> > > - frame->sp, name_plus_offset ? name_plus_offset :
name,
> > > frame->pc);
> > > +// frame->fp, name_plus_offset ? name_plus_offset :
name,
> > > frame->pc);
> > > + frame->fp ? frame->fp : bt->stacktop -
USER_EFRAME_OFFSET,
> > > name_plus_offset ? name_plus_offset : name, frame->pc);
> > >
> > > if (BT_REFERENCE_CHECK(bt))
> > > arm64_do_bt_reference_check(bt, frame->pc, name);
> > > @@ -1447,8 +1448,12 @@ arm64_display_full_frame(struct bt_info *bt, ulong
> > > sp)
> > > if (bt->frameptr == sp)
> > > return;
> > >
> > > - if (!INSTACK(sp, bt) || !INSTACK(bt->frameptr, bt))
> > > - return;
> > > + if (!INSTACK(sp, bt) || !INSTACK(bt->frameptr, bt)) {
> > > + if (sp == 0)
> > > + sp = bt->stacktop - USER_EFRAME_OFFSET;
> > > + else
> > > + return;
> > > + }
> > >
> > > words = (sp - bt->frameptr) / sizeof(ulong);
> > >
> > > @@ -1471,12 +1476,10 @@ arm64_unwind_frame(struct bt_info *bt, struct
> > > arm64_stackframe *frame)
> > > {
> > > unsigned long high, low, fp;
> > > unsigned long stack_mask;
> > > - unsigned long irq_stack_ptr, orig_sp, sp_in;
> > > + unsigned long irq_stack_ptr, orig_sp;
> > > struct arm64_pt_regs *ptregs;
> > > struct machine_specific *ms;
> > >
> > > - sp_in = frame->sp;
> > > -
> > > stack_mask = (unsigned long)(ARM64_STACK_SIZE) - 1;
> > > fp = frame->fp;
> > >
> > > @@ -1513,7 +1516,7 @@ arm64_unwind_frame(struct bt_info *bt, struct
> > > arm64_stackframe *frame)
> > > ptregs = (struct arm64_pt_regs
> > > *)&bt->stackbuf[(ulong)(STACK_OFFSET_TYPE(orig_sp))];
> > > frame->sp = orig_sp;
> > > frame->pc = ptregs->pc;
> > > - bt->bptr = sp_in;
> > > + bt->bptr = fp;
> > > if (CRASHDEBUG(1))
> > > error(INFO,
> > > "arm64_unwind_frame: switch stacks: fp: %lx sp: %lx pc:
%lx\n",
> > > @@ -1904,8 +1907,10 @@ arm64_print_exception_frame(struct bt_info *bt,
> > > ulong pt_regs, int mode, FILE *o
> > > ulong LR, SP, offset;
> > > char buf[BUFSIZE];
> > >
> > > +#if 0 /* FIXME? */
> > > if (bt->flags & BT_FULL)
> > > arm64_display_full_frame(bt, pt_regs);
> > > +#endif
> > >
> > > if (CRASHDEBUG(1))
> > > fprintf(ofp, "pt_regs: %lx\n", pt_regs);
> >
> > > --
> > > Crash-utility mailing list
> > > Crash-utility(a)redhat.com
> > >
https://www.redhat.com/mailman/listinfo/crash-utility
> >
> > --
> > Crash-utility mailing list
> > Crash-utility(a)redhat.com
> >
https://www.redhat.com/mailman/listinfo/crash-utility
> >
>
> --
> Crash-utility mailing list
> Crash-utility(a)redhat.com
>
https://www.redhat.com/mailman/listinfo/crash-utility
--
Crash-utility mailing list
Crash-utility(a)redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility