diff --git a/scripts/gdb/linux/tasks.py b/scripts/gdb/linux/tasks.py index cd259846ab4b190bf3e24972c8afe696d9231f1e..13bb97cd3312fad37f95053aa42ca02047fc0f26 100644 --- a/scripts/gdb/linux/tasks.py +++ b/scripts/gdb/linux/tasks.py @@ -44,3 +44,30 @@ class TaskList: utils.container_of(t['thread_group']['next'], self.task_ptr_type, "thread_group") return t + + +def get_task_by_pid(pid): + for task in TaskList(): + if int(task['pid']) == pid: + return task + return None + + +class LxTaskByPidFunc(gdb.Function): + """Find Linux task by PID and return the task_struct variable. + +$lx_task_by_pid(PID): Given PID, iterate over all tasks of the target and +return that task_struct variable which PID matches.""" + + def __init__(self): + super(LxTaskByPidFunc, self).__init__("lx_task_by_pid") + + def invoke(self, pid): + task = get_task_by_pid(pid) + if task: + return task.dereference() + else: + raise gdb.GdbError("No task of PID " + str(pid)) + + +LxTaskByPidFunc() diff --git a/scripts/gdb/vmlinux-gdb.py b/scripts/gdb/vmlinux-gdb.py index fa66d23ea5633b35b59d7829112b43738ac124b5..4d7eb2c409aae955b5ef17b51a447ae0ef3bc2ce 100644 --- a/scripts/gdb/vmlinux-gdb.py +++ b/scripts/gdb/vmlinux-gdb.py @@ -26,3 +26,4 @@ else: import linux.symbols import linux.modules import linux.dmesg + import linux.tasks