2 from . import KernelStruct
3 from .pcb import ProcInfo
4 from .signal import SignalContext
6 class ThreadStruct(KernelStruct):
7 def __init__(self, gdb_inferior: gdb.Value) -> None:
8 super().__init__(gdb_inferior, ThreadStruct)
10 self.__sigctx = SignalContext(self._kstruct["sigctx"].address)
13 def get_type() -> gdb.Type:
14 return gdb.lookup_type("struct thread").pointer()
16 def print_abstract(self, pp, *args):
17 tid = self._kstruct['tid']
18 pid = self._kstruct['process']['pid']
19 thactive = self._kstruct['process']['th_active']
20 state = ProcInfo.get_state(self._kstruct['state'])
22 notes = f"(acting, {state})" if thactive == self._kstruct else f"({state})"
23 pp.print(f"Thread: tid={int(tid)}, pid={int(pid)}", notes)
25 self.__sigctx.print_abstract(pp.next_level())
27 def print_detailed(self, pp, *args):
28 self.print_abstract(pp)
31 self.print_simple(pp2)
33 pp3 = pp2.next_level()
34 pp2.print("Containing Process")
35 pp3.print(ProcInfo(self._kstruct['process']))
37 self.__sigctx.print_detailed(pp2)
40 def print_simple(self, pp, *args):
42 pp2.print_field(self._kstruct, 'created', '+%dms')
43 pp2.print_field(self._kstruct, 'syscall_ret')
44 pp2.print_field(self._kstruct, 'exit_val')
45 pp2.print_field(self._kstruct, 'kstack')
46 self.__sigctx.print_simple(pp2)