~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/scripts/gdb/linux/tasks.py

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #
  2 # gdb helper commands and functions for Linux kernel debugging
  3 #
  4 #  task & thread tools
  5 #
  6 # Copyright (c) Siemens AG, 2011-2013
  7 #
  8 # Authors:
  9 #  Jan Kiszka <jan.kiszka@siemens.com>
 10 #
 11 # This work is licensed under the terms of the GNU GPL version 2.
 12 #
 13 
 14 import gdb
 15 
 16 from linux import utils, lists
 17 
 18 
 19 task_type = utils.CachedType("struct task_struct")
 20 
 21 
 22 def task_lists():
 23     task_ptr_type = task_type.get_type().pointer()
 24     init_task = gdb.parse_and_eval("init_task").address
 25     t = init_task
 26 
 27     while True:
 28         thread_head = t['signal']['thread_head']
 29         for thread in lists.list_for_each_entry(thread_head, task_ptr_type, 'thread_node'):
 30             yield thread
 31 
 32         t = utils.container_of(t['tasks']['next'],
 33                                task_ptr_type, "tasks")
 34         if t == init_task:
 35             return
 36 
 37 
 38 def get_task_by_pid(pid):
 39     for task in task_lists():
 40         if int(task['pid']) == pid:
 41             return task
 42     return None
 43 
 44 
 45 class LxTaskByPidFunc(gdb.Function):
 46     """Find Linux task by PID and return the task_struct variable.
 47 
 48 $lx_task_by_pid(PID): Given PID, iterate over all tasks of the target and
 49 return that task_struct variable which PID matches."""
 50 
 51     def __init__(self):
 52         super(LxTaskByPidFunc, self).__init__("lx_task_by_pid")
 53 
 54     def invoke(self, pid):
 55         task = get_task_by_pid(pid)
 56         if task:
 57             return task.dereference()
 58         else:
 59             raise gdb.GdbError("No task of PID " + str(pid))
 60 
 61 
 62 LxTaskByPidFunc()
 63 
 64 
 65 class LxPs(gdb.Command):
 66     """Dump Linux tasks."""
 67 
 68     def __init__(self):
 69         super(LxPs, self).__init__("lx-ps", gdb.COMMAND_DATA)
 70 
 71     def invoke(self, arg, from_tty):
 72         gdb.write("{:>10} {:>12} {:>7}\n".format("TASK", "PID", "COMM"))
 73         for task in task_lists():
 74             gdb.write("{} {:^5} {}\n".format(
 75                 task.format_string().split()[0],
 76                 task["pid"].format_string(),
 77                 task["comm"].string()))
 78 
 79 
 80 LxPs()
 81 
 82 
 83 thread_info_type = utils.CachedType("struct thread_info")
 84 
 85 
 86 def get_thread_info(task):
 87     thread_info_ptr_type = thread_info_type.get_type().pointer()
 88     if task_type.get_type().fields()[0].type == thread_info_type.get_type():
 89         return task['thread_info']
 90     thread_info = task['stack'].cast(thread_info_ptr_type)
 91     return thread_info.dereference()
 92 
 93 
 94 class LxThreadInfoFunc (gdb.Function):
 95     """Calculate Linux thread_info from task variable.
 96 
 97 $lx_thread_info(TASK): Given TASK, return the corresponding thread_info
 98 variable."""
 99 
100     def __init__(self):
101         super(LxThreadInfoFunc, self).__init__("lx_thread_info")
102 
103     def invoke(self, task):
104         return get_thread_info(task)
105 
106 
107 LxThreadInfoFunc()
108 
109 
110 class LxThreadInfoByPidFunc (gdb.Function):
111     """Calculate Linux thread_info from task variable found by pid
112 
113 $lx_thread_info_by_pid(PID): Given PID, return the corresponding thread_info
114 variable."""
115 
116     def __init__(self):
117         super(LxThreadInfoByPidFunc, self).__init__("lx_thread_info_by_pid")
118 
119     def invoke(self, pid):
120         task = get_task_by_pid(pid)
121         if task:
122             return get_thread_info(task.dereference())
123         else:
124             raise gdb.GdbError("No task of PID " + str(pid))
125 
126 
127 LxThreadInfoByPidFunc()

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php