~ [ 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 ] ~

Diff markup

Differences between /scripts/gdb/linux/tasks.py (Version linux-6.12-rc7) and /scripts/gdb/linux/tasks.py (Version linux-5.3.18)


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