| From: Kuan-Ying Lee <Kuan-Ying.Lee@mediatek.com> |
| Subject: scripts/gdb/symbols: add specific ko module load command |
| Date: Tue, 8 Aug 2023 16:30:11 +0800 |
| |
| Patch series "Add GDB memory helper commands", v2. |
| |
| I've created some GDB commands I think useful when I debug some memory |
| issues and kernel module issue. |
| |
| For memory issue, we would like to get slabinfo, slabtrace, page_owner and |
| vmallocinfo to debug the memory issues. |
| |
| For module issue, we would like to query kernel module name when we get a |
| module text address and load module symbol by specific path. |
| |
| Patch 1-2: |
| - Add kernel module related command. |
| Patch 3-5: |
| - Prepares for the memory-related command. |
| Patch 6-8: |
| - Add memory-related commands. |
| |
| |
| This patch (of 8): |
| |
| Add lx-symbols <ko_path> command to support add specific |
| ko module. |
| |
| Example output like below: |
| (gdb) lx-symbols mm/kasan/kasan_test.ko |
| loading @0xffff800002d30000: mm/kasan/kasan_test.ko |
| |
| Link: https://lkml.kernel.org/r/20230808083020.22254-1-Kuan-Ying.Lee@mediatek.com |
| Link: https://lkml.kernel.org/r/20230808083020.22254-2-Kuan-Ying.Lee@mediatek.com |
| Signed-off-by: Kuan-Ying Lee <Kuan-Ying.Lee@mediatek.com> |
| Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> |
| Cc: Chinwen Chang <chinwen.chang@mediatek.com> |
| Cc: Matthias Brugger <matthias.bgg@gmail.com> |
| Cc: Qun-Wei Lin <qun-wei.lin@mediatek.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| scripts/gdb/linux/symbols.py | 23 +++++++++++++++++++++-- |
| 1 file changed, 21 insertions(+), 2 deletions(-) |
| |
| --- a/scripts/gdb/linux/symbols.py~scripts-gdb-symbols-add-specific-ko-module-load-command |
| +++ a/scripts/gdb/linux/symbols.py |
| @@ -111,11 +111,12 @@ lx-symbols command.""" |
| return "{textaddr} {sections}".format( |
| textaddr=textaddr, sections="".join(args)) |
| |
| - def load_module_symbols(self, module): |
| + def load_module_symbols(self, module, module_file=None): |
| module_name = module['name'].string() |
| module_addr = str(module['mem'][constants.LX_MOD_TEXT]['base']).split()[0] |
| |
| - module_file = self._get_module_file(module_name) |
| + if not module_file: |
| + module_file = self._get_module_file(module_name) |
| if not module_file and not self.module_files_updated: |
| self._update_module_files() |
| module_file = self._get_module_file(module_name) |
| @@ -138,6 +139,19 @@ lx-symbols command.""" |
| else: |
| gdb.write("no module object found for '{0}'\n".format(module_name)) |
| |
| + def load_ko_symbols(self, mod_path): |
| + self.loaded_modules = [] |
| + module_list = modules.module_list() |
| + |
| + for module in module_list: |
| + module_name = module['name'].string() |
| + module_pattern = ".*/{0}\.ko(?:.debug)?$".format( |
| + module_name.replace("_", r"[_\-]")) |
| + if re.match(module_pattern, mod_path) and os.path.exists(mod_path): |
| + self.load_module_symbols(module, mod_path) |
| + return |
| + raise gdb.GdbError("%s is not a valid .ko\n" % mod_path) |
| + |
| def load_all_symbols(self): |
| gdb.write("loading vmlinux\n") |
| |
| @@ -176,6 +190,11 @@ lx-symbols command.""" |
| self.module_files = [] |
| self.module_files_updated = False |
| |
| + argv = gdb.string_to_argv(arg) |
| + if len(argv) == 1: |
| + self.load_ko_symbols(argv[0]) |
| + return |
| + |
| self.load_all_symbols() |
| |
| if hasattr(gdb, 'Breakpoint'): |
| _ |