Subject: toolchain/24098: GDB can't backtrace through Alpha kernel traps, despite intent
To: None <gnats-bugs@gnats.netbsd.org>
From: None <nathanw@mit.edu>
List: netbsd-bugs
Date: 01/14/2004 19:47:40
>Number: 24098
>Category: toolchain
>Synopsis: GDB can't backtrace through Alpha kernel traps, despite intent
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: toolchain-manager
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Thu Jan 15 00:48:00 UTC 2004
>Closed-Date:
>Last-Modified:
>Originator: Nathan J. Williams
>Release: NetBSD 1.6ZH
>Organization:
Massachvsetts Institvte of Technology
>Environment:
System: NetBSD samsung-means-to-come 1.6ZH NetBSD 1.6ZH (SAMSUNG) #57: Tue Jan 13 17:55:47 EST 2004 nathanw@marvin-the-martian.stuartst.com:/nbsd/src/sys/arch/alpha/compile/SAMSUNG alpha
Architecture: alpha
Machine: alpha
>Description:
Examining a core dump from a panic (see PR 24097), I noticed that the
GDB backtrace did not go back as far as the DDB backtrace.
DDB:
cpu_Debugger() at netbsd:cpu_Debugger+0x4
panic() at netbsd:panic+0x1f8
__assert() at netbsd:__assert+0x34
uvm_anfree() at netbsd:uvm_anfree+0xf8
amap_unref() at netbsd:amap_unref+0x318
uvmspace_free() at netbsd:uvmspace_free+0x268
uvm_proc_exit() at netbsd:uvm_proc_exit+0x1c
exit1() at netbsd:exit1+0x3b4
sys_exit() at netbsd:sys_exit+0x44
syscall_plain() at netbsd:syscall_plain+0xa8
XentSys() at netbsd:XentSys+0x5c
--- syscall (1) ---
--- user mode ---
GDB:
#0 0xfffffc00005302d8 in dumpsys ()
at ../../../../arch/alpha/alpha/machdep.c:1244
#1 0xfffffc0000530118 in cpu_reboot (howto=0, bootstr=0x0)
at ../../../../arch/alpha/alpha/machdep.c:1065
#2 0xfffffc000040b1b4 in db_fncall (addr=0, have_addr=0, count=0, modif=0x0)
at ../../../../ddb/db_command.c:666
#3 0xfffffc000040addc in db_command (last_cmdp=0xfffffc00005d6c70,
cmd_table=0xfffffc00005d68a0) at ../../../../ddb/db_command.c:464
#4 0xfffffc000040ac9c in db_command_loop ()
at ../../../../ddb/db_command.c:255
#5 0xfffffc000040fb7c in db_trap (type=0, code=0)
at ../../../../ddb/db_trap.c:101
#6 0xfffffc000053f984 in ddb_trap (a0=1, a1=0, a2=0, entry=3, regs=0x0)
at ../../../../arch/alpha/alpha/db_interface.c:211
#7 0xfffffc0000300194 in inc6 () at ../../../../arch/alpha/alpha/debug.s:50
#8 0xfffffc0000537ab8 in trap (a0=1, a1=18446740783697495032,
a2=18446739675669162144, entry=3, framep=0xfffffe0009333b60)
at ../../../../arch/alpha/alpha/trap.c:329
#9 0xfffffc00003003a4 in XentIF ()
at ../../../../arch/alpha/alpha/locore.s:461
#10 0xfffffc0000466048 in panic (fmt=0x1 <Address 0x1 out of bounds>)
at ../../../../kern/subr_prf.c:226
XentIF is a PAL entry point, and alpha/include/asm.h goes out of its
way to try and make this work:
/*
* PALVECT, ESETUP, and ERSAVE
* Declare a palcode transfer point, and carefully construct
* gdb symbols with an unusual _negative_ register-save offset
* so that gdb can find the otherwise lost PC and then
* invert the vector for traceback. Also, fix up framesize,
* allowing for the palframe for the same reason.
*/
... but it doesn't seem to work.
Further investigation shows that GDB thinks the size of the frame is
216 bytes:
(gdb) info frame
Stack level 9, frame at 0xfffffe0009333c38:
pc = 0xfffffc00003003a4 in XentIF
(../../../../arch/alpha/alpha/locore.s:461); saved pc 0xfffffc0000466048
called by frame at 0xfffffe0009333cc8, caller of frame at 0xfffffe0009333b60
source language asm.
Arglist at 0xfffffe0009333c08, args:
Locals at 0xfffffe0009333c38, Previous frame's sp in sp
Saved registers:
ra at 0xfffffe0009333c18, at at 0xfffffe0009333c28, pc at 0xfffffe0009333c18
(gdb) p 0xfffffe0009333cc8 - 0xfffffe0009333c38
$7 = 144
(gdb) p 0xfffffe0009333c38 - 0xfffffe0009333b60
$8 = 216
even though asm.h sets up a directive that should tell the debugger
the frame is larger (to account for the six quadwords pushed on the
stack by the PALcode entry sequence):
.frame $30,(FRAME_SW_SIZE+6)*8,$26,0; /* give gdb the real size */\
A little more digging turns up the fact that gcc is generating
DWARF-2 debug info for most of the kernel, but not for locore.o; the
gas info page confirms that .frame directives are not translated into
DWARF-2 info at present. I hypothesize that GDB latched on to the
DWARF-2 debug info and didn't or couldn't use the .mdebug info from
locore.o at the same time.
(However, a kernel compiled with -gstabs+ was even worse, and could
only show frame #0).
>How-To-Repeat:
>Fix:
Write (or pull in?) dwarf-2 support into the alpha bits of gas.
-gstabs+ kernel: no idea.
>Release-Note:
>Audit-Trail:
>Unformatted: