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