[Crash-utility] mod -S and debuginfo kernel rpm

Dave Anderson anderson at redhat.com
Tue Apr 21 15:17:13 UTC 2009


Hi Michael,

I knew this sounded familiar, but there is an option for adding
an alternative search directory starting point to "mod -S":

  crash> help mod

  NAME
    mod - module information and loading of symbols and debugging data

  SYNOPSIS
    mod [ -s module [objfile] | -d module | -S [directory] | -D | -r | -o ]

  ... [ snip ] ...

         -S [directory]  Load symbolic and debugging data from the object file
                         for all loaded modules.  For each module, a search
                         will be made for an object file consisting of the
                         module name with a .o or.ko suffix, starting at the
                         /lib/modules/<release> directory of the host system.
                         If a directory argument is appended, then the search
                         will be restricted to that directory.
  ... [ snip ] ...

However -- although this option would allow you to specify your local
directory tree containing the stripped module files, I don't think that
the gdb algorithm will be able to find the associated .ko.debug files
(unless you moved them into the same directory).

As I recall, the [directory] option above was put in place back in the day
when the modules were not split into .ko and .ko.debug files.  I may be
wrong, but I don't think so.  Give it a shot anyway.

The gdb code is in gdb-6.1/gdb/symfile.c:find_separate_debug_file().
Perhaps a callback function could be put in place there if a [directory]
argument was used.

Dave




----- "Dave Anderson" <anderson at redhat.com> wrote:

> ----- "Michael Holzheu" <holzheu at linux.vnet.ibm.com> wrote:
> 
> > > That is by intention.  The argument to the "mod" command should be
> > > the stripped "<module_name>.ko" file.  When loading that file, the
> > > embedded link to the "<module_name>.ko.debug" file found in the
> > > stripped "<module_name>.ko" file should be recognized and handled
> > > internally by the embedded gdb module.
> >
> > From where gets gdb this link? Is it somewhere stored in the ELF
> module
> > file?
> 
> There is the .gnu_debuglink section in the module that contains just
> the name
> of the associated .ko.debug file along with a CRC value to ensure it's
> the correct
> one after it finds it:
> 
>   $ objump -s /lib/modules/2.6.18-128.el5/kernel/fs/ext3/ext3.ko
> 
>   ... [ snip ] ...
> 
>   Contents of section .gnu_debuglink:
>    0000 65787433 2e6b6f2e 64656275 67000000  ext3.ko.debug...
>    0010 5392d21a
>   $
> 
> And then gdb takes it from there.  The embedded version of gdb
> (gdb-6.1)
> inside crash looks for the associated ext3.ko.debug file in 3
> directories,
> based upon first creating a fully-qualified path to the directory
> containing the stripped module files:
> 
> (1) in the same directory containing the stripped module
> (2) in the .debug subdirectory of the directory containing the
> stripped module
> (3) in /usr/lib/debug/<path-to-module-directory>
> 
> And so normally it finds the associated .ko.debug file in
> /usr/lib/debug/lib/modules/<release>/<path-to-module-directory>.
> 
> >
> > What I want to do is to unpack the kernel rpm and kernel debuginfo
> rpm
> > to my local directory and then load the modules with "mod -S"
> > In my local directory I have lib/modules/2.6.18-128.el5/ with the
> kernel
> > modules and usr/lib/debug/lib/modules/2.6.18-128.el5/ with the
> .debug files.
> >
> > When I use "mod -S lib/modules/2.6.18-128.el5" the debug information
> > seems not to be loaded.
> 
> With "mod -S", it will use the fully qualified pathname to the
> stripped module
> as the starting point, i.e.,
> /lib/modules/<release>/<path-to-module-directory>.
> It will look in that directory, in the .debug subdirectory in that
> directory,
> and finally in
> /usr/lib/debug/lib/modules/<release>/<path-to-module-directory>.
> 
> In your case, crash has no idea where you put the modules, so you
> would have
> to manually specify where each of the stripped modules are located
> with
> "mod -s <module> <your/directory/path/stripped-module-name>, and then
> put the
> associated .ko.debug in the same directory as each stripped module.
> 
> Any other behaviour such as what you're expecting would require a
> patch
> to kernel.c:module_objfile_search(), at the very bottom of the
> function
> just prior to it returning with a retbuf of NULL (which is what's
> happening
> to you now).  But even there, it would find the stripped module, but
> the
> gdb mechanism for finding the associated .ko.debug file would fail
> unless
> you manually moved the .ko.debug files into the same directory where
> their
> associated stripped module is located.
> 
> Dave




More information about the Crash-utility mailing list