linux-kernel.vger.kernel.org archive mirror
 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: Thomas Gleixner <tglx@linutronix.de>,
	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>
Subject: [PATCH v11 07/28] scripts/gdb: Add automatic symbol reloading on module insertion
Date: Thu, 29 Jan 2015 07:46:26 +0100	[thread overview]
Message-ID: <07d96e9a7b4ee20affc2c0e29c11d7b7612cefa2.1422514006.git.jan.kiszka@siemens.com> (raw)
In-Reply-To: <cover.1422514006.git.jan.kiszka@siemens.com>
In-Reply-To: <cover.1422514006.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()
-- 
2.1.4


  parent reply	other threads:[~2015-01-29  7:13 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-29  6:46 [PATCH v11 00/28] Add gdb python scripts as kernel debugging helpers Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 01/28] scripts/gdb: Add infrastructure Jan Kiszka
2015-01-29 13:23   ` Michal Marek
2015-01-29 13:37     ` Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 02/28] scripts/gdb: Add cache for type objects Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 03/28] scripts/gdb: Add container_of helper and convenience function Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 04/28] scripts/gdb: Add module iteration class Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 05/28] scripts/gdb: Add lx-symbols command Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 06/28] module: Do not inline do_init_module Jan Kiszka
2015-01-29  6:46 ` Jan Kiszka [this message]
2015-01-29  6:46 ` [PATCH v11 08/28] scripts/gdb: Add internal helper and convenience function to look up a module Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 09/28] scripts/gdb: Add get_target_endianness helper Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 10/28] scripts/gdb: Add read_u16/32/64 helpers Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 11/28] scripts/gdb: Add lx-dmesg command Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 12/28] scripts/gdb: Add task iteration class Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 13/28] scripts/gdb: Add helper and convenience function to look up tasks Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 14/28] scripts/gdb: Add is_target_arch helper Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 15/28] scripts/gdb: Add internal helper and convenience function to retrieve thread_info Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 16/28] scripts/gdb: Add get_gdbserver_type helper Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 17/28] scripts/gdb: Add internal helper and convenience function for per-cpu lookup Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 18/28] scripts/gdb: Add lx_current convenience function Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 19/28] scripts/gdb: Add class to iterate over CPU masks Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 20/28] scripts/gdb: Add lx-lsmod command Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 21/28] scripts/gdb: Add basic documentation Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 22/28] scripts/gdb: Port to python3 / gdb7.7 Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 23/28] scripts/gdb: Ignore byte-compiled python files Jan Kiszka
2015-01-29 13:15   ` Michal Marek
2015-01-29 13:35     ` Jan Kiszka
2015-01-29 14:34       ` Daniel Thompson
2015-01-29 14:41         ` Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 24/28] scripts/gdb: Use a generator instead of iterator for task list Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 25/28] scripts/gdb: Convert ModuleList to generator function Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 26/28] scripts/gdb: Convert CpuList " Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 27/28] scripts/gdb: Define maintainer Jan Kiszka
2015-01-29  6:46 ` [PATCH v11 28/28] scripts/gdb: Disable pagination while printing from breakpoint handler Jan Kiszka

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=07d96e9a7b4ee20affc2c0e29c11d7b7612cefa2.1422514006.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=tglx@linutronix.de \
    --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;
as well as URLs for NNTP newsgroup(s).