Re: [PATCH v2 1/2] Let gdb get kernel module symbols info from crash

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

 



Hi Kazu,

On Wed, Aug 31, 2022 at 10:13 AM HAGIO KAZUHITO(萩尾 一仁)
<k-hagio-ab@xxxxxxx> wrote:
>
> On 2022/08/29 22:45, Tao Liu wrote:
> > Gdb will try to resolve an address to its corresponding symbol name such as
> > when printing a structure. It works fine for kernel symbols, because gdb can
> > find them through vmlinux. However as for kernel modules symbols, crash
> > resolves them by dig into "struct module", which gdb don't know. As a
> > results, gdb fails to translate an kernel modules address to it's symbolic
> > name. For example we can reproduce the issue as follows.
> >
> >      crash> timer
> >      ....
> >      4331308176       336  ffff94ea24240860  ffffffffc03762c0  <estimation_timer>
> >      ....
> >      crash> sym 0xffffffffc03762c0
> >      ffffffffc03762c0 (t) estimation_timer [ip_vs]
> >
> > Before patch:
> >      crash> timer_list ffff94ea24240860
> >      struct timer_list {
> >        ....
> >        function = 0xffffffffc03762c0,
> >        ....
> >      }
> >
> > After patch:
> >      crash> timer_list ffff94ea24240860
> >      struct timer_list {
> >        ....
> >        function = 0xffffffffc03762c0 <estimation_timer>,
> >        ....
> >      }
> >
> > In this patch, we add an interface for gdb, when gdb trying to build kernel
> > module's address symbolic, the info can be get from crash.
>
> Nice enhancement.
> It would be helpful if you cannot do "mod -S" by some reason.
>
> >
> > Signed-off-by: Tao Liu <ltao@xxxxxxxxxx>
> > ---
> > v1 -> v2: Append the modification hunk at the end of gdb-10.2.patch
> > ---
> >   defs.h          |  2 ++
> >   gdb-10.2.patch  | 34 ++++++++++++++++++++++++++++++++++
> >   gdb_interface.c | 12 ++++++++++++
> >   3 files changed, 48 insertions(+)
> >
> > diff --git a/defs.h b/defs.h
> > index 9d6d891..afdcf6c 100644
> > --- a/defs.h
> > +++ b/defs.h
> > @@ -4874,6 +4874,7 @@ extern "C" int patch_kernel_symbol(struct gnu_request *);
> >   struct syment *symbol_search(char *);
> >   int gdb_line_number_callback(ulong, ulong, ulong);
> >   int gdb_print_callback(ulong);
> > +char *gdb_lookup_module_symbol(ulong, ulong *);
> >   extern "C" int same_file(char *, char *);
> >   #endif
> >
> > @@ -7284,6 +7285,7 @@ int gdb_pass_through(char *, FILE *, ulong);
> >   int gdb_readmem_callback(ulong, void *, int, int);
> >   int gdb_line_number_callback(ulong, ulong, ulong);
> >   int gdb_print_callback(ulong);
> > +char *gdb_lookup_module_symbol(ulong, ulong *);
> >   void gdb_error_hook(void);
> >   void restore_gdb_sanity(void);
> >   int is_gdb_command(int, ulong);
> > diff --git a/gdb-10.2.patch b/gdb-10.2.patch
> > index f0034ed..4fe16b0 100644
> > --- a/gdb-10.2.patch
> > +++ b/gdb-10.2.patch
> > @@ -1661,3 +1661,37 @@ exit 0
> >   +       return name_copy ? std::string (name_copy) : std::string ();
> >      }
> >    #endif
> > +
> > +--- gdb-10.2/gdb/printcmd.c.orig
> > ++++ gdb-10.2/gdb/printcmd.c
>
> This is the second patch for gdb/printcmd.c, please add this,
> just in case:
>
> --- a/gdb-10.2.patch
> +++ b/gdb-10.2.patch
> @@ -9,6 +9,7 @@
>   # to all subsequent patch applications.
>
>   tar xvzmf gdb-10.2.tar.gz \
> +       gdb-10.2/gdb/printcmd.c \
>          gdb-10.2/gdb/symfile.c \
>          gdb-10.2/gdb/Makefile.in
>
Sorry I missed that, thanks for pointing it out. Will send v3 to include it.

Thanks,
Tao Liu

> Thanks,
> Kazu
>
> > +@@ -576,6 +576,10 @@ print_address_symbolic (struct gdbarch *gdbarch, CORE_ADDR addr,
> > +
> > + /* See valprint.h.  */
> > +
> > ++#ifdef CRASH_MERGE
> > ++extern "C" char *gdb_lookup_module_symbol(unsigned long, unsigned long *);
> > ++#endif
> > ++
> > + int
> > + build_address_symbolic (struct gdbarch *gdbarch,
> > +                     CORE_ADDR addr,  /* IN */
> > +@@ -682,7 +686,19 @@ build_address_symbolic (struct gdbarch *gdbarch,
> > +     }
> > +     }
> > +   if (symbol == NULL && msymbol.minsym == NULL)
> > ++#ifdef CRASH_MERGE
> > ++  {
> > ++    char *name_ptr = gdb_lookup_module_symbol(addr, (unsigned long *)offset);
> > ++    if (name_ptr) {
> > ++      *name = name_ptr;
> > ++      return 0;
> > ++    } else {
> > ++      return 1;
> > ++    }
> > ++  }
> > ++#else
> > +     return 1;
> > ++#endif
> > +
> > +   /* If the nearest symbol is too far away, don't print anything symbolic.  */
> > +
> > diff --git a/gdb_interface.c b/gdb_interface.c
> > index 3a7fcc9..b14319c 100644
> > --- a/gdb_interface.c
> > +++ b/gdb_interface.c
> > @@ -935,6 +935,18 @@ gdb_print_callback(ulong addr)
> >               return IS_KVADDR(addr);
> >   }
> >
> > +char *
> > +gdb_lookup_module_symbol(ulong addr, ulong *offset)
> > +{
> > +     struct syment *sp;
> > +
> > +     if ((sp = value_search_module(addr, offset))) {
> > +             return sp->name;
> > +     } else {
> > +             return NULL;
> > +     }
> > +}
> > +
> >   /*
> >    *  Used by gdb_interface() to catch gdb-related errors, if desired.
> >    */

--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki




[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux