tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Symbol debugging support for kernel modules in crash dumps
Hi,
I just added symbol debugging support for modules in kernel dumps.
Things are not perfect because of what I call "current thread
confusion" in the kvm target, but as you see in the following
session it works just fine if you follow the right steps. First of
all you need a build from HEAD that has the capability to build
.debug files for kernel modules. Once that's done, you are all
set; see how it works (comments prefixed by ####)
Enjoy,
christos
$ gdb /usr/src/sys/arch/amd64/compile/QUASAR/netbsd.gdb
GNU gdb (GDB) 8.3
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64--netbsd".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/src/sys/arch/amd64/compile/QUASAR/netbsd.gdb...
(gdb) target kvm netbsd.22.core
0xffffffff80224375 in cpu_reboot (howto=howto@entry=260,
bootstr=bootstr@entry=0x0) at ../../../../arch/amd64/amd64/machdep.c:718
warning: Source file is more recent than executable.
718 if (s != IPL_NONE)
#### Ok we got a stacktrace here, but we don't have a current thread...
#### So we set it...
(gdb) info thread
Id Target Id Frame
* 2.1 <kvm> 0xffffffff80224375 in cpu_reboot (
howto=howto@entry=260, bootstr=bootstr@entry=0x0)
at ../../../../arch/amd64/amd64/machdep.c:718
No selected thread. See `help thread'.
(gdb) thread 2.1
[Switching to thread 2.1 (<kvm>)]
#0 0xffffffff80224375 in ?? ()
#### Note that here we lost all symbol table access when we switched threads
#### let's load it again..
(gdb) add-symbol-file /usr/src/sys/arch/amd64/compile/QUASAR/netbsd.gdb
add symbol table from file "/usr/src/sys/arch/amd64/compile/QUASAR/netbsd.gdb"
(y or n) y
Reading symbols from /usr/src/sys/arch/amd64/compile/QUASAR/netbsd.gdb...
#### OK, lets load our modules
(gdb) source /usr/src/sys/gdbscripts/modload
(gdb) modload
add symbol table from file "/stand/amd64/9.99.59/modules/ping/ping.kmod" at
.text_addr = 0xffffffff8266e000
.data_addr = 0xffffffff8266b000
.rodata_addr = 0xffffffff8266c000
add symbol table from file "/stand/amd64/9.99.59/modules/nfsserver/nfsserver.kmod" at
.text_addr = 0xffffffff82a64000
.data_addr = 0xffffffff82669000
.rodata_addr = 0xffffffff8298e000
add symbol table from file "/stand/amd64/9.99.59/modules/npf_ext_log/npf_ext_log.kmod" at
.text_addr = 0xffffffff82668000
.data_addr = 0xffffffff82667000
.rodata_addr = 0xffffffff82969000
add symbol table from file "/stand/amd64/9.99.59/modules/npf_alg_icmp/npf_alg_icmp.kmod" at
.text_addr = 0xffffffff82666000
.data_addr = 0xffffffff82665000
.rodata_addr = 0xffffffff82952000
add symbol table from file "/stand/amd64/9.99.59/modules/bpfjit/bpfjit.kmod" at
.text_addr = 0xffffffff82661000
.data_addr = 0x0
.rodata_addr = 0xffffffff828dd000
add symbol table from file "/stand/amd64/9.99.59/modules/sljit/sljit.kmod" at
.text_addr = 0xffffffff82945000
.data_addr = 0xffffffff82664000
.rodata_addr = 0xffffffff828f9000
add symbol table from file "/stand/amd64/9.99.59/modules/if_npflog/if_npflog.kmod" at
.text_addr = 0xffffffff82660000
.data_addr = 0xffffffff8265f000
.rodata_addr = 0xffffffff828ca000
add symbol table from file "/stand/amd64/9.99.59/modules/npf/npf.kmod" at
.text_addr = 0xffffffff82648000
.data_addr = 0xffffffff82647000
.rodata_addr = 0xffffffff826d6000
add symbol table from file "/stand/amd64/9.99.59/modules/bpf/bpf.kmod" at
.text_addr = 0xffffffff82622000
.data_addr = 0xffffffff82621000
.rodata_addr = 0xffffffff826a3000
add symbol table from file "/stand/amd64/9.99.59/modules/bpf_filter/bpf_filter.kmod" at
.text_addr = 0xffffffff8263c000
.data_addr = 0x0
.rodata_addr = 0xffffffff82627000
add symbol table from file "/stand/amd64/9.99.59/modules/scsiverbose/scsiverbose.kmod" at
.text_addr = 0xffffffff826a2000
.data_addr = 0xffffffff82686000
.rodata_addr = 0xffffffff82687000
add symbol table from file "/stand/amd64/9.99.59/modules/usbverbose/usbverbose.kmod" at
.text_addr = 0xffffffff82685000
.data_addr = 0xffffffff82670000
.rodata_addr = 0xffffffff82671000
add symbol table from file "/stand/amd64/9.99.59/modules/miiverbose/miiverbose.kmod" at
.text_addr = 0xffffffff82646000
.data_addr = 0xffffffff8263d000
.rodata_addr = 0xffffffff8263e000
#### Finally!
(gdb) where
#0 0xffffffff80224375 in cpu_reboot (howto=howto@entry=260,
bootstr=bootstr@entry=0x0) at ../../../../arch/amd64/amd64/machdep.c:718
#1 0xffffffff80680a7f in kern_reboot (howto=260, bootstr=bootstr@entry=0x0)
at ../../../../kern/kern_reboot.c:73
#2 0xffffffff804b5003 in db_reboot_cmd (addr=<optimized out>,
have_addr=<optimized out>, count=<optimized out>, modif=<optimized out>)
at ../../../../ddb/db_command.c:1436
#3 0xffffffff804b581b in db_command (
last_cmdp=last_cmdp@entry=0xffffffff80e2e6a0 <db_last_command>)
at ../../../../ddb/db_command.c:940
#4 0xffffffff804b5b86 in db_command_loop ()
at ../../../../ddb/db_command.c:599
#5 0xffffffff804b968a in db_trap (type=type@entry=1, code=code@entry=0)
at ../../../../ddb/db_trap.c:91
#6 0xffffffff80220c05 in kdb_trap (type=type@entry=1, code=code@entry=0,
regs=regs@entry=0xffffc784a8f58c00)
at ../../../../arch/amd64/amd64/db_interface.c:247
#7 0xffffffff80225ef2 in trap (frame=0xffffc784a8f58c00)
at ../../../../arch/amd64/amd64/trap.c:315
#8 0xffffffff8021ed43 in alltraps ()
#9 0xffffffff8021f55d in breakpoint ()
#### Those two are from the module...
#10 0xffffffff8266e04c in ping_ioctl (self=<optimized out>, cmd=536899586,
data=<optimized out>, flag=<optimized out>, l=<optimized out>)
at /net/quasar/src-5/NetBSD/src.acl/sys/modules/examples/ping/ping.c:104
#11 ping_ioctl (self=<optimized out>, cmd=<optimized out>,
data=<optimized out>, flag=<optimized out>, l=<optimized out>)
at /net/quasar/src-5/NetBSD/src.acl/sys/modules/examples/ping/ping.c:98
#12 0xffffffff806b1f68 in cdev_ioctl (dev=89856, cmd=536899586,
data=0xffffc784a8f58ee0, flag=3, l=0xffffa6841902a140)
at ../../../../kern/subr_devsw.c:935
#13 0xffffffff8073505c in VOP_IOCTL (vp=vp@entry=0xffffa6840d48c380,
command=command@entry=536899586, data=data@entry=0xffffc784a8f58ee0,
fflag=<optimized out>, cred=<optimized out>)
at ../../../../kern/vnode_if.c:646
#14 0xffffffff8072b87e in vn_ioctl (fp=0xffffa68408795100, com=536899586,
data=0xffffc784a8f58ee0) at ../../../../kern/vfs_vnops.c:780
#15 0xffffffff806d5bc7 in sys_ioctl (l=<optimized out>,
uap=0xffffc784a8f59000, retval=<optimized out>)
at ../../../../kern/sys_generic.c:671
#16 0xffffffff80254aae in sy_call (rval=0xffffc784a8f58fb0,
--Type <RET> for more, q to quit, c to continue without paging--
uap=0xffffc784a8f59000, l=0xffffa6841902a140,
sy=0xffffffff80e442f0 <sysent+1296>) at ../../../../sys/syscallvar.h:65
#17 sy_invoke (code=54, rval=0xffffc784a8f58fb0, uap=0xffffc784a8f59000,
l=0xffffa6841902a140, sy=0xffffffff80e442f0 <sysent+1296>)
at ../../../../sys/syscallvar.h:94
#18 syscall (frame=0xffffc784a8f59000)
at ../../../../arch/x86/x86/syscall.c:138
#19 0xffffffff802096ad in handle_syscall ()
(gdb) q
A debugging session is active.
Inferior 2 [<kvm>] will be killed.
Quit anyway? (y or n) y
You can't do that without a process to debug.
Home |
Main Index |
Thread Index |
Old Index