All of lore.kernel.org
 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>, Ben Widawsky <ben@bwidawsk.net>,
	Borislav Petkov <bp@suse.de>
Subject: [PATCH v12 07/28] scripts/gdb: Add automatic symbol reloading on module insertion
Date: Fri, 30 Jan 2015 08:24:36 +0100	[thread overview]
Message-ID: <d32cfd6e0815cfffb10a0fa5d62f3984562bc486.1422602696.git.jan.kiszka@siemens.com> (raw)
In-Reply-To: <cover.1422602696.git.jan.kiszka@siemens.com>
In-Reply-To: <cover.1422602696.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-30  7:32 UTC|newest]

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