Debugging Loadable Modules Using GDB

John Baldwin jhb at freebsd.org
Mon Aug 30 21:46:24 UTC 2010


On Monday, August 30, 2010 4:34:04 pm Alexander Fiveg wrote:
> On Mon, Aug 30, 2010 at 01:10:37PM -0400, John Baldwin wrote:
>  > On Monday, August 30, 2010 12:12:50 pm Alexander Fiveg wrote:
> > > On Mon, Aug 30, 2010 at 08:16:11AM -0400, John Baldwin wrote:
> > >  > On Friday, August 27, 2010 4:11:41 pm Alexander Fiveg wrote:
> > > > > Hi,
> > > > > from "FreeBSD Developers' Handbook, 10.7 Debugging Loadable Modules Using
> > > > > GDB":
> > > > > "...
> > > > > (kgdb) add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0
> > > > > ...
> > > > > "
> > > > > Actually I couldn't debug my modules using .ko-file. Moreover, I've find out 
> > > > that .ko files do not contain sections with debugging info. With .kld-file 
> > > > debugging works out. Do I something incorrectly or the info in the Developers 
> > > > Book is outdated?
> > > > 
> > > > With newer versions of kgdb you shouldn't need to manually invoke 'add-symbol-
> > > > file'.  Kernel modules are treated as shared libraries and should 
> > > > automatically be loaded.  Try using 'info sharedlibrary' to see the list of 
> > > > kernel modules and if symbols for them are loaded already.
> > > Yes, the .ko files are loaded automatically. The problem is that they do
> > > not contain debugging info. I have always to load the .kld file in order to 
> > > debug a module:
> > > 
> > > (kgdb) f 9
> > > #9  0xc4dc558b in rm_8254_delayed_interrupt_per_packet () from
> > > /boot/kernel/if_ringmap.ko
> > > (kgdb) info locals
> > > No symbol table info available.
> > > 
> > > (kgdb) add-symbol-file /home/alexandre/p4/ringmap/current/sys/modules/ringmap/if_ringmap.kld 0xc4dafc70
> > > add symbol table from file "/home/alexandre/p4/ringmap/current/sys/modules/ringmap/if_ringmap.kld"
> > > at
> > > 	.text_addr = 0xc4dafc70
> > > (y or n) y
> > > Reading symbols from /home/alexandre/p4/ringmap/current/sys/modules/ringmap/if_ringmap.kld...done.
> > > 
> > > (kgdb) f 9 
> > > #9  0xc4dc558b in rm_8254_delayed_interrupt_per_packet ()
> > >     at /home/alexandre/p4/ringmap/current/sys/modules/ringmap/../../dev/e1000/ringmap_8254.c:142
> > > 142	co->ring->slot[slot_num].ts = co->ring->last_ts;
> > > 
> > > (kgdb) info locals
> > > co = (struct capt_object *) 0xc4d68380
> > > adapter = (struct adapter *) 0xc4e77000
> > > __func__ = "E\000\000�\034@\000\000\211\203�E\000\000\017\206B\022\000\000\2039\000\213A\004\017\205�\f\000\000\001��1�"
> > > 
> > > 
> > > Is there any way to get the all symbols and needed debug info without
> > > loading the .kld file ?
> > 
> > How are you compiling the kld?  If you are building it by hand, use
> > 'make DEBUG_FLAGS=-g' when you build and install the kld.  That should build
> > with debug symbols enabled and install the ko.symbols file which kgdb will
> > find and use.
> Thanks a lot!. That is what I want to know. But I think this option is not 
> mentioned anywhere. I could not find it in "man make make.conf" and also 
> no mention about it in FreeBSD Developers' Handbook. 

It's a bit of a "feature" of the bsd.*.mk files that if you define
'DEBUG_FLAGS' it is added to CFLAGS (and CXXFLAGS) and that any resulting
binaries are not stripped, etc.  The same trick can be used to build debug
versions of binaries and libraries.  It probably is underdocumented.  Not
sure make.conf(5) is the right place as the typical usage is on the command
line, not in /etc/make.conf or /etc/src.conf.  However, I can't think of a
better place.  Maybe src.conf(5)?

-- 
John Baldwin



More information about the freebsd-doc mailing list