[Crash-utility] [PATCH 2/2] dis: Report duplicate symbols
Dave Anderson
anderson at redhat.com
Mon Jul 6 14:35:01 UTC 2015
----- Original Message -----
>
>
> ----- Original Message -----
> > Notify the user if there is more than one symbol of the given target.
> >
> > For example, after this patch:
> >
> > - The 'dis' command now reports that more than one symbol of "watchdog"
> > exists, to allow the user to be more specific
> >
> > crash> dis watchdog
> > duplicate symbols found: watchdog
> > ffffffff810e6100 (t) watchdog
> > /usr/src/debug/kernel-2.6.32-431.1.2.el6/linux-2.6.32-431.1.2.el6.x86_64/kernel/hung_task.c:
> > 199
> > ffffffff810e6990 (t) watchdog
> > /usr/src/debug/kernel-2.6.32-431.1.2.el6/linux-2.6.32-431.1.2.el6.x86_64/kernel/watchdog.c:
> > 332
> > ffffffff81eb3fc8 (b) watchdog
Also, is it worth worrying about non-text symbols like the "(b) watchdog" above?
Maybe the patch should ignore symbols whose sp->type is not (t) or (T)?
Dave
> >
> > - Choose to disassemble the watchdog() function defined in
> > kernel/watchdog.c by using the address of the first function
> >
> > crash> dis ffffffff810e6990
> > 0xffffffff810e6990 <watchdog>: push %rbp
> > 0xffffffff810e6991 <watchdog+1>: mov %rsp,%rbp
> > 0xffffffff810e6994 <watchdog+4>: push %r13
> > 0xffffffff810e699d <watchdog+13>: nopl 0x0(%rax,%rax,1)
> > ...
> >
> > Signed-off-by: Aaron Tomlin <atomlin at redhat.com>
>
> Hi Aaron,
>
> Good plan.
>
> But is there any particular reason for adding "show_flags"? Since the symbol
> passed to show_symbol() will never have an offset, it doesn't make any
> difference
> to save and use the incoming radix, as opposed to the -x|d override, or for
> that
> matter, nothing.
>
> Dave
>
>
> > ---
> > defs.h | 1 +
> > kernel.c | 28 ++++++++++++++++++++++++----
> > symbols.c | 3 +--
> > 3 files changed, 26 insertions(+), 6 deletions(-)
> >
> > diff --git a/defs.h b/defs.h
> > index f21137d..26aa963 100644
> > --- a/defs.h
> > +++ b/defs.h
> > @@ -4585,6 +4585,7 @@ void show_symbol(struct syment *, ulong, ulong);
> > #define SHOW_DEC_OFFS (0x8)
> > #define SHOW_RADIX() (*gdb_output_radix == 16 ? SHOW_HEX_OFFS :
> > SHOW_DEC_OFFS)
> > #define SHOW_MODULE (0x10)
> > +int symbol_name_count(char *);
> > int symbol_query(char *, char *, struct syment **);
> > struct syment *next_symbol(char *, struct syment *);
> > struct syment *prev_symbol(char *, struct syment *);
> > diff --git a/kernel.c b/kernel.c
> > index 628779c..b87d9ec 100644
> > --- a/kernel.c
> > +++ b/kernel.c
> > @@ -1339,6 +1339,7 @@ cmd_dis(void)
> > ulong revtarget;
> > ulong count;
> > ulong offset;
> > + ulong show_flags;
> > struct syment *sp;
> > struct gnu_request *req;
> > char *savename;
> > @@ -1362,6 +1363,7 @@ cmd_dis(void)
> > sp = NULL;
> > unfiltered = user_mode = do_machdep_filter = do_load_module_filter = 0;
> > radix = 0;
> > + show_flags = SHOW_LINENUM | SHOW_RADIX();
> >
> > req = (struct gnu_request *)getbuf(sizeof(struct gnu_request));
> > req->buf = GETBUF(BUFSIZE);
> > @@ -1425,7 +1427,28 @@ cmd_dis(void)
> > radix = pc->output_radix;
> >
> > if (args[optind]) {
> > - if (can_eval(args[optind]))
> > + if ((sp = symbol_search(args[optind])) &&
> > + ((symbol_name_count(sp->name)) > 1)) {
> > + fprintf(fp, "duplicate symbols found: %s\n",
> > + args[optind]);
> > +
> > + do {
> > + if (module_symbol(sp->value, NULL, NULL,
> > + NULL, 0))
> > + show_symbol(sp, 0, show_flags|SHOW_MODULE);
> > + else
> > + show_symbol(sp, 0, show_flags);
> > +
> > + } while ((sp = symbol_search_next(sp->name, sp)));
> > +
> > + FREEBUF(req->buf);
> > + FREEBUF(req);
> > + return;
> > + }
> > + if (sp) {
> > + req->addr = sp->value;
> > + req->flags |= GNU_FUNCTION_ONLY;
> > + } else if (can_eval(args[optind]))
> > req->addr = eval(args[optind], FAULT_ON_ERROR,
> > NULL);
> > else if (hexadecimal(args[optind], 0)) {
> > req->addr = htol(args[optind], FAULT_ON_ERROR,
> > NULL);
> > @@ -1438,9 +1461,6 @@ cmd_dis(void)
> > }
> > if (!offset)
> > req->flags |= GNU_FUNCTION_ONLY;
> > - } else if ((sp = symbol_search(args[optind]))) {
> > - req->addr = sp->value;
> > - req->flags |= GNU_FUNCTION_ONLY;
> > } else {
> > fprintf(fp, "symbol not found: %s\n",
> > args[optind]);
> > fprintf(fp, "possible alternatives:\n");
> > diff --git a/symbols.c b/symbols.c
> > index 48d9f58..958181a 100644
> > --- a/symbols.c
> > +++ b/symbols.c
> > @@ -37,7 +37,6 @@ static asection *get_kernel_section(char *);
> > static char * get_section(ulong vaddr, char *buf);
> > static void symbol_dump(ulong, char *);
> > static void check_for_dups(struct load_module *);
> > -static int symbol_name_count(char *);
> > static struct syment *kallsyms_module_symbol(struct load_module *,
> > symbol_info *);
> > static void store_load_module_symbols \
> > (bfd *, int, void *, long, uint, ulong, char *);
> > @@ -4156,7 +4155,7 @@ symbol_search(char *s)
> > /*
> > * Count the number of instances of a symbol name.
> > */
> > -static int
> > +int
> > symbol_name_count(char *s)
> > {
> > int i;
> > --
> > 2.4.3
> >
> > --
> > Crash-utility mailing list
> > Crash-utility at redhat.com
> > https://www.redhat.com/mailman/listinfo/crash-utility
> >
>
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
>
More information about the Crash-utility
mailing list