Support to multi-threading and pthread interface (POSIX.1-2008) (#23)
[lunaix-os.git] / lunaix-os / scripts / gdb / lunadbg / region_dump.py
1 import gdb
2 from .utils import pid_argument, llist_foreach
3 from .structs.region import MemRegion
4 from .pp import MyPrettyPrinter
5
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)
10
11     def region_callback(self, pp, idx, region):
12         pp.print(f"VMR #{idx}:")
13         ppp = pp.next_level()
14         vmr = MemRegion(region)
15         vmr.print_detailed(ppp)
16
17     def invoke(self, argument: str, from_tty: bool) -> None:
18         argument = pid_argument(argument)
19         
20         pid = gdb.parse_and_eval(f"{argument}->pid")
21
22         argument = f"&{argument}->mm->regions"
23         val = gdb.parse_and_eval(argument)
24         region_t = gdb.lookup_type("struct mm_region").pointer()
25         
26         pp = MyPrettyPrinter()
27         pp.print("VMRS (pid: %d)"%(pid))
28         
29         num = llist_foreach(val, region_t, "head", lambda a,b: self.region_callback(pp, a,b), inclusive=False)
30         if not num:
31             pp.print("no regions")