mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@siemens.com>
To: Andrew Morton <akpm@linux-foundation.org>, linux-kernel@vger.kernel.org
Cc: Jason Wessel <jason.wessel@windriver.com>,
	kgdb-bugreport@lists.sourceforge.net,
	Andi Kleen <andi@firstfloor.org>, Tom Tromey <tromey@redhat.com>,
	Ben Widawsky <ben@bwidawsk.net>, Borislav Petkov <bp@suse.de>,
	Tatiana Al-Chueyr Martins <tatiana.alchueyr@gmail.com>
Subject: [PATCH v6 07/21] scripts/gdb: Add automatic symbol reloading on module insertion
Date: Mon, 28 Oct 2013 09:58:44 +0100	[thread overview]
Message-ID: <8084ea07fae1cb628258d94ecc6a4e43ceec50c3.1382950737.git.jan.kiszka@siemens.com> (raw)
In-Reply-To: <cover.1382950737.git.jan.kiszka@siemens.com>
In-Reply-To: <cover.1382950737.git.jan.kiszka@siemens.com>

This installs a silent breakpoint on the do_init_module function. The
breakpoint handler will try to load symbols from the module files found
during lx-symbols execution. This way, breakpoints can be set to module
initialization functions, and there is no need to explicitly call
lx-symbols after (re-)loading a module.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 scripts/gdb/linux/symbols.py | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/scripts/gdb/linux/symbols.py b/scripts/gdb/linux/symbols.py
index bd21a96..139841f 100644
--- a/scripts/gdb/linux/symbols.py
+++ b/scripts/gdb/linux/symbols.py
@@ -19,6 +19,30 @@ import string
 from linux import modules, utils
 
 
+if hasattr(gdb, 'Breakpoint'):
+    class LoadModuleBreakpoint(gdb.Breakpoint):
+        def __init__(self, spec, gdb_command):
+            super(LoadModuleBreakpoint, self).__init__(spec, internal=True)
+            self.silent = True
+            self.gdb_command = gdb_command
+
+        def stop(self):
+            module = gdb.parse_and_eval("mod")
+            module_name = module['name'].string()
+            cmd = self.gdb_command
+
+            # enforce update if object file is not found
+            cmd.module_files_updated = False
+
+            if module_name in cmd.loaded_modules:
+                gdb.write("refreshing all symbols to reload module "
+                          "'{0}'\n".format(module_name))
+                cmd.load_all_symbols()
+            else:
+                cmd.load_module_symbols(module)
+            return False
+
+
 class LxSymbols(gdb.Command):
     """(Re-)load symbols of Linux kernel and currently loaded modules.
 
@@ -30,6 +54,8 @@ lx-symbols command."""
     module_paths = []
     module_files = []
     module_files_updated = False
+    loaded_modules = []
+    breakpoint = None
 
     def __init__(self):
         super(LxSymbols, self).__init__("lx-symbols", gdb.COMMAND_FILES,
@@ -87,6 +113,8 @@ lx-symbols command."""
                 addr=module_addr,
                 sections=self._section_arguments(module))
             gdb.execute(cmdline, to_string=True)
+            if not module_name in self.loaded_modules:
+                self.loaded_modules.append(module_name)
         else:
             gdb.write("no module object found for '{0}'\n".format(module_name))
 
@@ -104,6 +132,7 @@ lx-symbols command."""
         gdb.execute("symbol-file", to_string=True)
         gdb.execute("symbol-file vmlinux")
 
+        self.loaded_modules = []
         module_list = modules.ModuleList()
         if not module_list:
             gdb.write("no modules found\n")
@@ -123,5 +152,15 @@ lx-symbols command."""
 
         self.load_all_symbols()
 
+        if hasattr(gdb, 'Breakpoint'):
+            if not self.breakpoint is None:
+                self.breakpoint.delete()
+                self.breakpoint = None
+            self.breakpoint = LoadModuleBreakpoint(
+                "kernel/module.c:do_init_module", self)
+        else:
+            gdb.write("Note: symbol update on module loading not supported "
+                      "with this gdb version\n")
+
 
 LxSymbols()
-- 
1.8.1.1.298.ge7eed54


  parent reply	other threads:[~2013-10-28  9:17 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-28  8:58 [PATCH v6 00/21] Add gdb python scripts as kernel debugging helpers Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 01/21] scripts/gdb: Add infrastructure Jan Kiszka
2013-10-30  5:35   ` Andi Kleen
2013-10-30 10:28     ` Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 02/21] scripts/gdb: Add cache for type objects Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 03/21] scripts/gdb: Add container_of helper and convenience function Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 04/21] scripts/gdb: Add module iteration class Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 05/21] scripts/gdb: Add lx-symbols command Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 06/21] module: Do not inline do_init_module Jan Kiszka
2013-10-28  8:58 ` Jan Kiszka [this message]
2013-10-28  8:58 ` [PATCH v6 08/21] scripts/gdb: Add internal helper and convenience function to look up a module Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 09/21] scripts/gdb: Add get_target_endianness helper Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 10/21] scripts/gdb: Add read_u16/32/64 helpers Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 11/21] scripts/gdb: Add lx-dmesg command Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 12/21] scripts/gdb: Add task iteration class Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 13/21] scripts/gdb: Add helper and convenience function to look up tasks Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 14/21] scripts/gdb: Add is_target_arch helper Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 15/21] scripts/gdb: Add internal helper and convenience function to retrieve thread_info Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 16/21] scripts/gdb: Add get_gdbserver_type helper Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 17/21] scripts/gdb: Add internal helper and convenience function for per-cpu lookup Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 18/21] scripts/gdb: Add lx_current convenience function Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 19/21] scripts/gdb: Add class to iterate over CPU masks Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 20/21] scripts/gdb: Add lx-lsmod command Jan Kiszka
2013-10-28  8:58 ` [PATCH v6 21/21] scripts/gdb: Add basic documentation Jan Kiszka
2013-10-30 11:17   ` Borislav Petkov
2013-10-30 11:22     ` Jan Kiszka
2013-10-30 11:46       ` Borislav Petkov

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=8084ea07fae1cb628258d94ecc6a4e43ceec50c3.1382950737.git.jan.kiszka@siemens.com \
    --to=jan.kiszka@siemens.com \
    --cc=akpm@linux-foundation.org \
    --cc=andi@firstfloor.org \
    --cc=ben@bwidawsk.net \
    --cc=bp@suse.de \
    --cc=jason.wessel@windriver.com \
    --cc=kgdb-bugreport@lists.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tatiana.alchueyr@gmail.com \
    --cc=tromey@redhat.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®