How to get stack from every thread when doing crash dump?
Ed Maste
emaste at phaedrus.sandvine.ca
Mon Jul 4 23:14:02 GMT 2005
On Thu, Jun 23, 2005 at 06:15:43PM -0700, Peter Wemm wrote:
> But I wonder if what you're running into is possibly a result of gdb not
> parsing the stack frames from exception.s? We do not emit any dwarf2
> call frame information for any assembler code, and gdb6 is dwarf2
> based. And since it is dwarf2 based, during the last cleanups the gdb
> developers did, they removed (or moved) the places that we used to
> insert stack frame sniffers to cope with crossing the nonstandard
> assembler stack frames. As a result, we don't generally show traces
> that cross exceptions any more.
It seems worse than that -- the gdb backtrace might show unknown or
completely bogus frames as a result. For example, we've run across
the tty locking issue (discussed on -stable), and backtraces often
look like:
#6 0xa0723d8a in calltrap () at /usr/src/sys/i386/i386/exception.s:202
#7 0xc7f10018 in ?? ()
#8 0xa05b0010 in power_profile_set_state (state=0)
at /usr/src/sys/kern/subr_power.c:110
#9 0xa05c942c in ttwakeup (tp=0xa23fdc00) at /usr/src/sys/kern/tty.c:2370
#10 0xa05c7d71 in ttymodem (tp=0xa23fdc00, flag=0)
at /usr/src/sys/kern/tty.c:1625
when in reality frames 7 and 8 should actually be a single frame in
knote().
> If that is the problem you're seeing, then the fix is that somebody
> needs to annotate the *.s and *.S files with .cfa_* pseudo-ops so that
> dwarf2 frame descriptors are emitted for a -g kernel. This is
> non-trivial though.
I assume you meant .cfi_* -- .cfi_startproc, .cfi_offset etc? I had a
quick look and it doesn't seem like it should be difficult. I ran into
one issue though -- these get written to the .eh_frame section. The
data emitted by gcc goes in .debug_frame, but the two have the same
format.
I tried changing the linker script to put both in the .debug_frame
section, but ld faild ("Not enough room for program headers"). The
.eh_frame section is marked loadable, so it seems ld still tries to
create a phdr entry for it. Once I can figure out how to address
that I'll test out adding the .cfi_ pseudo-ops to exception.s.
--
Ed Maste, Sandvine Incorporated
More information about the freebsd-arch
mailing list