+++ /dev/null
-import gdb
-from .utils import pid_argument
-
-class ProcessHelper:
- PS_READY = 0
- PS_RUNNING = 1
- PS_TERMNAT = 2
- PS_DESTROY = 4
- PS_PAUSED = 8
- PS_BLOCKED = 16
- PS_CREATED = 32
-
- def get_state(proc: gdb.Value):
- state_t = proc["state"]
- if (state_t == ProcessHelper.PS_READY):
- return "ready"
- if (state_t == ProcessHelper.PS_RUNNING):
- return "running"
- if (state_t & (ProcessHelper.PS_TERMNAT | ProcessHelper.PS_DESTROY)):
- return "terminated"
- if (state_t & ProcessHelper.PS_BLOCKED):
- return "blocked"
- if (state_t & ProcessHelper.PS_PAUSED):
- return "paused"
-
- def process_at(pid):
- return gdb.parse_and_eval(pid_argument(pid))
-
- @staticmethod
- def pp_process(proc: gdb.Value):
- print(" pid:", proc["pid"])
- print(" pgid:", proc["pgid"])
- if proc["parent"] == 0:
- print(" root process")
- else:
- print(" ppid:", proc["parent"]["pid"])
- print(" page table:", proc["page_table"])
-
- print(" state:", ProcessHelper.get_state(proc))
- print(" created: +%dms"%(proc["created"]))
- print(" saved context:")
- print(" %s"%(proc["intr_ctx"].dereference()
- .format_string(max_depth=3, format='x')
- .replace('\n', '\n ')))
-
-
-class ProcessDump(gdb.Command):
- """Dump the state of Lunaix PCB"""
- def __init__(self) -> None:
- super().__init__("proc", gdb.COMMAND_USER)
-
- def invoke(self, argument: str, from_tty: bool) -> None:
- argument = pid_argument(argument)
-
- proc = gdb.parse_and_eval(argument)
-
- ProcessHelper.pp_process(proc)
-
-class ProcessTableDump(gdb.Command):
- """Dump the state of Lunaix process table"""
- def __init__(self) -> None:
- super().__init__("proc_table", gdb.COMMAND_USER)
-
- def invoke(self, argument: str, from_tty: bool) -> None:
- sched_context = gdb.parse_and_eval("sched_ctx")
- total_entries = sched_context["ptable_len"]
- print("inited entries: %d"%(total_entries))
- print("scheduled pid: %d"%(sched_context["procs_index"]))
- print("Process Table:")
-
- for i in range(0, total_entries):
- p = ProcessHelper.process_at(i)
- if (p == 0):
- continue
- state = ProcessHelper.get_state(p)
- print(" pid:%02d [%s]"%(i, state))
\ No newline at end of file