From: Cort Dougan <cort@fsmlabs.com>
To: linux-kernel@vger.kernel.org
Subject: [PATCH] cheap lookup of symbol names on oops()
Date: Thu, 25 Jul 2002 11:00:33 -0600 [thread overview]
Message-ID: <20020725110033.G2276@host110.fsmlabs.com> (raw)
This is from the -atp (Aunt Tillie and Penelope) tree.
This patch adds a small function that looks up symbol names that correspond
to given addresses by digging through the already existent ksyms table.
It's invaluable for debugging on embedded systems - especially when testing
modules - since ksymoops is a hassle to deal with in cross-build
environments. We already have this info in the kernel so we might as well
use it.
This patch adds use of the function for PPC and i386.
diff -Nru a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c
--- a/arch/i386/kernel/traps.c Thu Jul 25 01:11:24 2002
+++ b/arch/i386/kernel/traps.c Thu Jul 25 01:11:24 2002
@@ -201,8 +201,11 @@
esp = regs->esp;
ss = regs->xss & 0xffff;
}
- printk("CPU: %d\nEIP: %04x:[<%08lx>] %s\nEFLAGS: %08lx\n",
- smp_processor_id(), 0xffff & regs->xcs, regs->eip, print_tainted(), regs->eflags);
+ printk("CPU: %d\nEIP: %04x:[<%08lx>]",
+ smp_processor_id(), 0xffff & regs->xcs, regs->eip );
+ module_print_addr(" ", regs->eip, NULL);
+ printk(" %s\nEFLAGS: %08lx\n",
+ print_tainted(), regs->eflags);
printk("eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n",
regs->eax, regs->ebx, regs->ecx, regs->edx);
printk("esi: %08lx edi: %08lx ebp: %08lx esp: %08lx\n",
diff -Nru a/arch/i386/mm/fault.c b/arch/i386/mm/fault.c
--- a/arch/i386/mm/fault.c Thu Jul 25 01:11:24 2002
+++ b/arch/i386/mm/fault.c Thu Jul 25 01:11:24 2002
@@ -323,7 +323,9 @@
printk(KERN_ALERT "Unable to handle kernel paging request");
printk(" at virtual address %08lx\n",address);
printk(" printing eip:\n");
- printk("%08lx\n", regs->eip);
+ printk("%08lx", regs->eip);
+ module_print_addr(" ",regs->eip, NULL);
+ printk("\n");
asm("movl %%cr3,%0":"=r" (page));
page = ((unsigned long *) __va(page))[address >> 22];
printk(KERN_ALERT "*pde = %08lx\n", page);
diff -Nru a/arch/ppc/kernel/process.c b/arch/ppc/kernel/process.c
--- a/arch/ppc/kernel/process.c Thu Jul 25 01:11:24 2002
+++ b/arch/ppc/kernel/process.c Thu Jul 25 01:11:24 2002
@@ -245,8 +245,11 @@
{
int i;
- printk("NIP: %08lX XER: %08lX LR: %08lX SP: %08lX REGS: %p TRAP: %04lx %s\n",
- regs->nip, regs->xer, regs->link, regs->gpr[1], regs,regs->trap, print_tainted());
+ printk("NIP: %08lX");
+ module_print_addr(" ", regs->nip, NULL);
+ printk("\n");
+ printk("XER: %08lX LR: %08lX SP: %08lX REGS: %p TRAP: %04lx %s\n",
+ regs->xer, regs->link, regs->gpr[1], regs,regs->trap, print_tainted());
printk("MSR: %08lx EE: %01x PR: %01x FP: %01x ME: %01x IR/DR: %01x%01x\n",
regs->msr, regs->msr&MSR_EE ? 1 : 0, regs->msr&MSR_PR ? 1 : 0,
regs->msr & MSR_FP ? 1 : 0,regs->msr&MSR_ME ? 1 : 0,
diff -Nru a/include/linux/module.h b/include/linux/module.h
--- a/include/linux/module.h Thu Jul 25 01:11:24 2002
+++ b/include/linux/module.h Thu Jul 25 01:11:24 2002
@@ -411,4 +411,10 @@
#define SET_MODULE_OWNER(some_struct) do { } while (0)
#endif
+#ifdef CONFIG_MODULES
+void module_print_addr(char *, unsigned long, char *);
+#else /* CONFIG_MODULES */
+#define module_print_addr(x,y,z) do { } while (0)
+#endif /* CONFIG_MODULES */
+
#endif /* _LINUX_MODULE_H */
diff -Nru a/kernel/module.c b/kernel/module.c
--- a/kernel/module.c Thu Jul 25 01:11:24 2002
+++ b/kernel/module.c Thu Jul 25 01:11:24 2002
@@ -238,6 +238,63 @@
struct module *find_module(const char *name);
void free_module(struct module *, int tag_freed);
+/*
+ * Lookup an address in all modules (including the kernel) ksyms
+ * and print any corresponding symbol name. Useful for quick
+ * recognition of faulting addresses during panics without
+ * the need for user space tools.
+ * -- Cort <cort@fsmlabs.com>
+ */
+void module_print_addr(char *s1, unsigned long addr, char *s2)
+{
+ unsigned long best_match = 0; /* so far */
+ char best_match_string[60] = {0, }; /* so far */
+ struct module *mod;
+ struct module_symbol *sym;
+ int j;
+
+ /* user addresses - just print user and return -- Cort */
+ if ( addr < PAGE_OFFSET )
+ {
+ if ( s1 )
+ printk("%s", s1);
+ printk("(user)");
+ if ( s2 )
+ printk("%s", s2);
+ return;
+ }
+
+ for (mod = module_list; mod; mod = mod->next)
+ {
+ for ( j = 0, sym = mod->syms; j < mod->nsyms; ++j, ++sym)
+ {
+ /* is this a better match than what we've
+ * found so far? -- Cort */
+ if ( (sym->value < addr) &&
+ ((addr - sym->value) < (addr - best_match)) )
+ {
+ best_match = sym->value;
+ /* kernelmodule.name is "" so we
+ * have a special case -- Cort */
+ if ( mod->name[0] == 0 )
+ sprintf(best_match_string, "%s",
+ sym->name);
+ else
+ sprintf(best_match_string, "%s:%s",
+ sym->name, mod->name);
+ }
+ }
+ }
+
+ if ( best_match )
+ {
+ if ( s1 )
+ printk("%s", s1);
+ printk("(%s + 0x%lx)", best_match_string, addr - best_match);
+ if ( s2 )
+ printk("%s", s2);
+ }
+}
/*
* Called at boot time
next reply other threads:[~2002-07-25 17:04 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-07-25 17:00 Cort Dougan [this message]
2002-07-25 17:11 ` [PATCH] cheap lookup of symbol names on oops() Christoph Hellwig
2002-07-25 17:21 ` Cort Dougan
2002-07-25 18:49 ` Benjamin LaHaise
2002-07-25 20:16 ` Cort Dougan
2002-07-25 19:04 ` Andrea Arcangeli
2002-07-25 20:27 ` Cort Dougan
2002-07-25 20:59 ` Andrea Arcangeli
2002-07-25 21:05 ` Cort Dougan
2002-07-25 22:06 ` Andrea Arcangeli
2002-07-25 22:05 ` Cort Dougan
2002-07-25 22:56 ` Andrea Arcangeli
2002-07-25 23:01 ` Cort Dougan
2002-07-26 22:37 ` module oops tracking [Re: [PATCH] cheap lookup of symbol names on oops()] Andrea Arcangeli
2002-07-26 22:55 ` Cort Dougan
2002-07-26 23:28 ` Andrea Arcangeli
2002-07-26 23:31 ` Cort Dougan
2002-07-27 0:10 ` Andrea Arcangeli
2002-07-27 2:15 ` cort
2002-07-27 0:19 ` Keith Owens
2002-07-27 0:31 ` Andrea Arcangeli
2002-07-27 1:19 ` Andrea Arcangeli
2002-07-27 1:33 ` Keith Owens
2002-07-27 1:47 ` Andrea Arcangeli
2002-07-25 21:12 ` [PATCH] cheap lookup of symbol names on oops() Lars Marowsky-Bree
2002-07-25 22:13 ` Andrea Arcangeli
2002-07-25 22:41 ` Rik van Riel
2002-07-25 23:01 ` Andrea Arcangeli
2002-07-26 7:57 ` Lars Marowsky-Bree
[not found] ` <Pine.LNX.4.44L.0207251941120.3086-100000@imladris.surriel. com>
2002-07-27 2:34 ` Stevie O
2002-07-25 22:39 ` Rik van Riel
2002-07-26 1:01 ` Marcin Dalecki
2002-07-25 22:46 ` Alan Cox
2002-07-25 21:44 ` Cort Dougan
2002-07-25 22:18 ` Russell King
2002-07-25 22:23 ` Cort Dougan
2002-07-25 22:44 ` Rik van Riel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20020725110033.G2276@host110.fsmlabs.com \
--to=cort@fsmlabs.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.