modules.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #
  2. # gdb helper commands and functions for Linux kernel debugging
  3. #
  4. # module tools
  5. #
  6. # Copyright (c) Siemens AG, 2013
  7. #
  8. # Authors:
  9. # Jan Kiszka <jan.kiszka@siemens.com>
  10. #
  11. # This work is licensed under the terms of the GNU GPL version 2.
  12. #
  13. import gdb
  14. from linux import cpus, utils, lists
  15. module_type = utils.CachedType("struct module")
  16. def module_list():
  17. global module_type
  18. module_ptr_type = module_type.get_type().pointer()
  19. modules = gdb.parse_and_eval("modules")
  20. for module in lists.list_for_each_entry(modules, module_ptr_type, "list"):
  21. yield module
  22. def find_module_by_name(name):
  23. for module in module_list():
  24. if module['name'].string() == name:
  25. return module
  26. return None
  27. class LxModule(gdb.Function):
  28. """Find module by name and return the module variable.
  29. $lx_module("MODULE"): Given the name MODULE, iterate over all loaded modules
  30. of the target and return that module variable which MODULE matches."""
  31. def __init__(self):
  32. super(LxModule, self).__init__("lx_module")
  33. def invoke(self, mod_name):
  34. mod_name = mod_name.string()
  35. module = find_module_by_name(mod_name)
  36. if module:
  37. return module.dereference()
  38. else:
  39. raise gdb.GdbError("Unable to find MODULE " + mod_name)
  40. LxModule()
  41. class LxLsmod(gdb.Command):
  42. """List currently loaded modules."""
  43. _module_use_type = utils.CachedType("struct module_use")
  44. def __init__(self):
  45. super(LxLsmod, self).__init__("lx-lsmod", gdb.COMMAND_DATA)
  46. def invoke(self, arg, from_tty):
  47. gdb.write(
  48. "Address{0} Module Size Used by\n".format(
  49. " " if utils.get_long_type().sizeof == 8 else ""))
  50. for module in module_list():
  51. layout = module['core_layout']
  52. gdb.write("{address} {name:<19} {size:>8} {ref}".format(
  53. address=str(layout['base']).split()[0],
  54. name=module['name'].string(),
  55. size=str(layout['size']),
  56. ref=str(module['refcnt']['counter'] - 1)))
  57. t = self._module_use_type.get_type().pointer()
  58. first = True
  59. sources = module['source_list']
  60. for use in lists.list_for_each_entry(sources, t, "source_list"):
  61. gdb.write("{separator}{name}".format(
  62. separator=" " if first else ",",
  63. name=use['source']['name'].string()))
  64. first = False
  65. gdb.write("\n")
  66. LxLsmod()