crash.types.task module

class crash.types.task.LinuxTask(task_struct: gdb.Value)[source]

Bases: object

A wrapper class for struct task_struct. There will be typically one of these allocated for every task discovered in the debugging environment.

Parameters:task_struct – The task to wrap. The value must be of type struct task_struct.
task_struct

The task being wrapped. The value is of type struct task_struct.

Type:gdb.Value
active

Whether this task is active

Type:bool
cpu

The CPU number the task was using

Type:int
regs

The registers associated with this task, if active

thread_info

The architecture-specific struct thread_info for this task. The value will be of type struct thread_info.

Type:gdb.Value
thread

The GDB representation of the thread.

Type:gdb.InferiorThread
mem_valid

Whether the memory statistics are currently valid.

Type:bool
rss

The size of the resident memory for this task.

Type:int
total_vm

The total size of the vm space for this task.

Type:int
pgd_addr

The address of the top of the page table tree.

Type:int
Raises:
attach_thread(thread: gdb.InferiorThread) → None[source]

Associate a gdb thread with this task

Parameters:thread – The gdb thread to associate with this task
get_last_cpu() → int[source]

Returns the last cpu this task was scheduled to execute on

Returns:The last cpu this task was scheduled to execute on
Return type:int
get_rss() → int[source]

Return the resident set for this task

Returns:The size of the resident memory set for this task
Return type:int
get_stack_pointer() → int[source]

Get the stack pointer for this task

Returns:

The address of the stack pointer for this task.

Return type:

int

Raises:
  • NotImplementedError – The architecture hasn’t provided
  • a stack pointer callback.
get_thread_info() → gdb.Value[source]

Get the thread info for this task

The thread info structure is architecture specific and so this method abstracts its retreival.

Returns:
The struct thread_info associated with this
task. The type of the value is struct thread_info.
Return type:gdb.Value
is_exiting() → bool[source]

Returns whether a task is exiting

Returns:Whether the task is exiting
Return type:bool
is_kernel_task() → bool[source]
is_thread_group_leader() → bool[source]

Returns whether a task is a thread group leader

Returns:Whether the task is a thread group leader
Return type:bool
is_zombie() → bool[source]

Returns whether a task is in Zombie state

Returns:Whether the task is in zombie state
Return type:bool
last_run() → int[source]

The timestamp of when this task was last run

Returns:The timestamp of when this task was last run
Return type:int
maybe_dead() → bool[source]

Returns whether this task is dead

Returns:Whether this task is dead
Return type:bool
parent_pid() → int[source]

Returns the pid of this task’s parent

Returns:The pid of this task’s parent
Return type:int
set_active(cpu: int, regs: Dict[str, int]) → None[source]

Set this task as active in the debugging environment

Parameters:
  • cpu – Which CPU this task was using
  • regs – The registers associated with this task
Raises:

InvalidArgumentError – The cpu was not a valid integer.

classmethod set_get_stack_pointer(fn: Callable[[gdb.Value], int]) → None[source]

Set the stack pointer callback for this architecture

The callback must accept a gdb.Value of type struct thread and return a int containing the address of the stack pointer.

Parameters:fn – The callback to use. It will be used by all tasks.
set_thread_info(thread_info: gdb.Value) → None[source]

Set the thread info for this task

The thread info structure is architecture specific. This method allows the architecture code to assign its thread info structure to this task.

Parameters:thread_info – The struct thread_info to be associated with this task. The value must be of type struct thread_info.
task_address() → int[source]

Returns the address of the task_struct for this task

Returns:The address of the task_struct
Return type:int
task_flags() → int[source]

Returns the flags for this task

Returns:The flags for this task
Return type:int
task_name(brackets: bool = False) → str[source]

Returns the comm field of this task

Parameters:brackets – If this task is a kernel thread, surround the name in square brackets
Returns:The comm field of this task a python string
Return type:str
task_pid() → int[source]

Returns the pid of this task

Returns:The pid of this task
Return type:int
task_state() → int[source]

Return the task state flags for this task (possibly broken due to combining flags from ``state`` and ``exit_state``).

Returns:The state flags for this task.
Return type:int
update_mem_usage() → None[source]

Update the memory usage for this task

Tasks are created initially without their memory statistics. This method explicitly updates them.

crash.types.task.TF

alias of crash.types.task.TaskStateFlags

class crash.types.task.TaskStateFlags[source]

Bases: object

A class to contain state related to discovering task flag values. Not meant to be instantiated.

The initial values below are overridden once symbols are available to resolve them properly.

EXIT_DEAD = -1
EXIT_ZOMBIE = -1
TASK_DEAD = -1
TASK_EXCLUSIVE = -1
TASK_FLAG_UNINITIALIZED = -1
TASK_IDLE = -1
TASK_INTERRUPTIBLE = -1
TASK_NEW = -1
TASK_NOLOAD = -1
TASK_PARKED = -1
TASK_RUNNING = 0
TASK_STOPPED = -1
TASK_SWAPPING = -1
TASK_TRACING_STOPPED = -1
TASK_UNINTERRUPTIBLE = -1
TASK_WAKEKILL = -1
TASK_WAKING = -1
classmethod has_flag(flagname: str) → bool[source]
classmethod task_state_flags_callback(symbol: gdb.Symbol) → None[source]

Detect which task flags this kernel uses.

Meant to be used as a SymbolCallback.

Different kernels use different task flags or even different values for the same flags. This method tries to determine the flags for the kernel.

Parameters:symbol – The task_state_array symbol.
crash.types.task.for_each_all_tasks() → Iterator[gdb.Value][source]

Iterate the task list and yield each task including any associated thread tasks

Yields:gdb.Value – The next task on the list. The value is of type struct task_struct.
crash.types.task.for_each_thread_group_leader() → Iterator[gdb.Value][source]

Iterate the task list and yield each thread group leader

Yields:gdb.Value – The next task on the list. The value is of type struct task_struct.
crash.types.task.for_each_thread_in_group(task: gdb.Value) → Iterator[gdb.Value][source]

Iterate a thread group leader’s thread list and yield each struct task_struct

Parameters:task – The task_struct that is the thread group leader. The value must be of type struct task_struct.
Yields:gdb.Value – The next task on the list. The value is of type struct task_struct.