2 from ..pp import MyPrettyPrinter
3 from . import KernelStruct
4 from ..utils import pid_argument, llist_foreach, get_dnode_path
7 class ProcInfo(KernelStruct):
8 def __init__(self, gdb_inferior: gdb.Value) -> None:
9 super().__init__(gdb_inferior, ProcInfo)
12 def get_type() -> gdb.Type:
13 return gdb.lookup_type("struct proc_info").pointer()
15 def print_detailed(self, pp : MyPrettyPrinter, *args):
16 self.print_abstract(pp)
18 pp2 = (pp.next_level()
20 self.print_simple(pp2)
22 def print_simple(self, pp : MyPrettyPrinter, *args):
23 pp.print_field(self._kstruct, 'pid')
24 pp.print_field(self._kstruct, 'pgid')
25 pp.print_field(self._kstruct, 'parent', fmt="(pid=%d)", cast=lambda v: v["pid"])
26 pp.print_field(self._kstruct, 'cwd', cast=lambda v: get_dnode_path(v))
27 pp.print_field(self._kstruct, 'created', '+%dms')
28 pp.print_field(self._kstruct, 'exit_code')
29 pp.print_field(self._kstruct, 'thread_count')
31 pp.printf("active thread: (tid=%d)", self._kstruct['th_active']['tid'])
33 def print_abstract(self, pp : MyPrettyPrinter, *args):
34 pid = self._kstruct['pid']
35 ppid = self._kstruct['parent']['pid']
36 cmd = self._kstruct['cmd']
37 cmd = cmd.string() if cmd != 0 else ''
38 state = ProcInfo.get_state(self._kstruct["state"])
40 pp.print(f"pid={pid}, ppid={ppid}, cmd='{cmd}', {state}")
52 def get_state(state_t):
53 if (state_t == ProcInfo.PS_READY):
55 if (state_t == ProcInfo.PS_RUNNING):
57 if (state_t & (ProcInfo.PS_TERMNAT | ProcInfo.PS_DESTROY)):
59 if (state_t & ProcInfo.PS_BLOCKED):
61 if (state_t & ProcInfo.PS_PAUSED):
63 return "<unknown> (0x%x)"%(state_t)
67 return ProcInfo(gdb.parse_and_eval(pid_argument(pid)))