2 from .utils import pid_argument, llist_foreach
3 from .structs.region import MemRegion
4 from .pp import MyPrettyPrinter
6 class MemoryRegionDump(gdb.Command):
7 """Dump virtual memory regions associated with a process"""
8 def __init__(self) -> None:
9 super().__init__("vmrs", gdb.COMMAND_USER)
11 def region_callback(self, pp, idx, region):
12 pp.print(f"VMR #{idx}:")
14 vmr = MemRegion(region)
15 vmr.print_detailed(ppp)
17 def invoke(self, argument: str, from_tty: bool) -> None:
18 argument = pid_argument(argument)
20 pid = gdb.parse_and_eval(f"{argument}->pid")
22 argument = f"&{argument}->mm->regions"
23 val = gdb.parse_and_eval(argument)
24 region_t = gdb.lookup_type("struct mm_region").pointer()
26 pp = MyPrettyPrinter()
27 pp.print("VMRS (pid: %d)"%(pid))
29 num = llist_foreach(val, region_t, "head", lambda a,b: self.region_callback(pp, a,b), inclusive=False)
31 pp.print("no regions")