Hopefully Simple Question on Debugging Kernel Modules

John Baldwin jhb at freebsd.org
Mon Feb 23 08:59:36 PST 2009


On Friday 20 February 2009 6:40:56 pm David Christensen wrote:
> I'm sure this is a simple question but the answer is alluding my Google
> search capabilities.  My driver is being loaded as a kernel module and
> is failing with the following error:
> 
> Fatal trap 12: page fault while in kernel mode
> cpuid = 0; apic id = 00
> fault virtual address   = 0xfffffffe40abe9dc
> fault code              = supervisor write data, page not present
> instruction pointer     = 0x8:0xffffffff920b638f
> stack pointer           = 0x10:0xffffffff9212bb10
> frame pointer           = 0x10:0xffffffff9212bbb0
> code segment            = base 0x0, limit 0xfffff, type 0x1b
>                         = DPL 0, pres 1, long 1, def32 0, gran 1
> processor eflags        = interrupt enabled, resume, IOPL = 0
> current process         = 12 (irq268: bce0)
> [thread pid 12 tid 100166 ]
> Stopped at      bce_intr+0x8df: addl    $0x1,0x2c854(%r12,%rax,4)
> db>
> 
> I simply need to find the offending source line in my driver.  Not sure 
> how I've managed to get the driver running at all without this but it's 
> time to do things the right way.  I have KDB/DDB/GDB built into my 
> -CURRENT kernel already.  It'd be great to find the source line while in
> the kernel debugger but I'm also fine with rebooting the system to 
> identify the line number.

Just use gdb on bce.ko (built with debug symbols):

gdb /path/to/if_bce.ko
(gdb) l *bce_intr+0x8df

If you get a crashdump you can run kgdb on it and just walk up to the relevant 
stack frame and use 'l' there to get a listing.

-- 
John Baldwin


More information about the freebsd-current mailing list