tech-kern archive

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

Re: Symbol debugging support for kernel modules in crash dumps



Fantastic! Thanks.

Dave

Spilling kerrectud by iPhone

> On May 1, 2020, at 6:34 PM, Christos Zoulas <christos%zoulas.com@localhost> wrote:
> 
> 
> 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