feat: lunadbg GDB plugin to ease kernel debugging process.
[lunaix-os.git] / lunaix-os / scripts / gdb / lunadbg / proc_table_dump.py
1 import gdb
2 from .utils import pid_argument
3
4 class ProcessHelper:
5     PS_READY   = 0
6     PS_RUNNING = 1
7     PS_TERMNAT = 2
8     PS_DESTROY = 4
9     PS_PAUSED  = 8
10     PS_BLOCKED = 16
11     PS_CREATED = 32
12
13     def get_state(proc: gdb.Value):
14         state_t = proc["state"]
15         if (state_t == ProcessHelper.PS_READY):
16             return "ready"
17         if (state_t == ProcessHelper.PS_RUNNING):
18             return "running"
19         if (state_t & (ProcessHelper.PS_TERMNAT | ProcessHelper.PS_DESTROY)):
20             return "terminated"
21         if (state_t & ProcessHelper.PS_BLOCKED):
22             return "blocked"
23         if (state_t & ProcessHelper.PS_PAUSED):
24             return "paused"
25         
26     def process_at(pid):
27         return gdb.parse_and_eval(pid_argument(pid))
28
29     @staticmethod    
30     def pp_process(proc: gdb.Value):
31         print("  pid:", proc["pid"])
32         print("  pgid:", proc["pgid"])
33         if proc["parent"] == 0:
34             print(" root process")
35         else:
36             print("  ppid:", proc["parent"]["pid"])
37         print("  page table:", proc["page_table"])
38
39         print("  state:", ProcessHelper.get_state(proc))
40         print("  created: +%dms"%(proc["created"]))
41         print("  saved context:")
42         print("     %s"%(proc["intr_ctx"].dereference()
43                          .format_string(max_depth=3, format='x')
44                          .replace('\n', '\n     ')))
45
46
47 class ProcessDump(gdb.Command):
48     """Dump the state of Lunaix PCB"""
49     def __init__(self) -> None:
50         super().__init__("proc", gdb.COMMAND_USER)
51
52     def invoke(self, argument: str, from_tty: bool) -> None:
53         argument = pid_argument(argument)
54
55         proc = gdb.parse_and_eval(argument)
56
57         ProcessHelper.pp_process(proc)
58
59 class ProcessTableDump(gdb.Command):
60     """Dump the state of Lunaix process table"""
61     def __init__(self) -> None:
62         super().__init__("proc_table", gdb.COMMAND_USER)
63
64     def invoke(self, argument: str, from_tty: bool) -> None:
65         sched_context = gdb.parse_and_eval("sched_ctx")
66         total_entries = sched_context["ptable_len"]
67         print("inited entries: %d"%(total_entries))
68         print("scheduled pid: %d"%(sched_context["procs_index"]))
69         print("Process Table:")
70
71         for i in range(0, total_entries):
72             p = ProcessHelper.process_at(i)
73             if (p == 0):
74                 continue
75             state = ProcessHelper.get_state(p)
76             print("   pid:%02d [%s]"%(i, state))