--- /dev/null
+import gdb
+from . import KernelStruct
+from .pcb import ProcInfo
+from .signal import SignalContext
+
+class ThreadStruct(KernelStruct):
+ def __init__(self, gdb_inferior: gdb.Value) -> None:
+ super().__init__(gdb_inferior, ThreadStruct)
+
+ self.__sigctx = SignalContext(self._kstruct["sigctx"].address)
+
+ @staticmethod
+ def get_type() -> gdb.Type:
+ return gdb.lookup_type("struct thread").pointer()
+
+ def print_abstract(self, pp, *args):
+ tid = self._kstruct['tid']
+ pid = self._kstruct['process']['pid']
+ thactive = self._kstruct['process']['th_active']
+ state = ProcInfo.get_state(self._kstruct['state'])
+
+ notes = f"(acting, {state})" if thactive == self._kstruct else f"({state})"
+ pp.print(f"Thread: tid={int(tid)}, pid={int(pid)}", notes)
+
+ self.__sigctx.print_abstract(pp.next_level())
+
+ def print_detailed(self, pp, *args):
+ self.print_abstract(pp)
+
+ pp2 = pp.next_level()
+ self.print_simple(pp2)
+
+ pp3 = pp2.next_level()
+ pp2.print("Containing Process")
+ pp3.print(ProcInfo(self._kstruct['process']))
+
+ self.__sigctx.print_detailed(pp2)
+
+
+ def print_simple(self, pp, *args):
+ pp2 = pp.next_level()
+ pp2.print_field(self._kstruct, 'created', '+%dms')
+ pp2.print_field(self._kstruct, 'syscall_ret')
+ pp2.print_field(self._kstruct, 'exit_val')
+ pp2.print_field(self._kstruct, 'kstack')
+ self.__sigctx.print_simple(pp2)