2 from .utils import pid_argument
13 def get_state(proc: gdb.Value):
14 state_t = proc["state"]
15 if (state_t == ProcessHelper.PS_READY):
17 if (state_t == ProcessHelper.PS_RUNNING):
19 if (state_t & (ProcessHelper.PS_TERMNAT | ProcessHelper.PS_DESTROY)):
21 if (state_t & ProcessHelper.PS_BLOCKED):
23 if (state_t & ProcessHelper.PS_PAUSED):
27 return gdb.parse_and_eval(pid_argument(pid))
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")
36 print(" ppid:", proc["parent"]["pid"])
37 print(" page table:", proc["page_table"])
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 ')))
47 class ProcessDump(gdb.Command):
48 """Dump the state of Lunaix PCB"""
49 def __init__(self) -> None:
50 super().__init__("proc", gdb.COMMAND_USER)
52 def invoke(self, argument: str, from_tty: bool) -> None:
53 argument = pid_argument(argument)
55 proc = gdb.parse_and_eval(argument)
57 ProcessHelper.pp_process(proc)
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)
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:")
71 for i in range(0, total_entries):
72 p = ProcessHelper.process_at(i)
75 state = ProcessHelper.get_state(p)
76 print(" pid:%02d [%s]"%(i, state))