Message ID | 20231127070404.4192-2-Kuan-Ying.Lee@mediatek.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fix GDB commands error | expand |
On 11/27, Kuan-Ying Lee wrote: > > @@ -25,13 +25,9 @@ def task_lists(): > t = g = init_task > > while True: > - while True: > - yield t > - > - t = utils.container_of(t['thread_group']['next'], > - task_ptr_type, "thread_group") > - if t == g: > - break > + thread_head = t['signal']['thread_head'] > + for thread in lists.list_for_each_entry(thread_head, task_ptr_type, 'thread_node'): > + yield thread > > t = g = utils.container_of(g['tasks']['next'], > task_ptr_type, "tasks") Thanks! I do not know python, but it seems that with this patch we can kill g or t? Can't def task_lists(): task_ptr_type = task_type.get_type().pointer() init_task = gdb.parse_and_eval("init_task").address t = init_task while True: thread_head = t['signal']['thread_head'] for thread in lists.list_for_each_entry(thread_head, task_ptr_type, 'thread_node'): yield thread t = utils.container_of(t['tasks']['next'], task_ptr_type, "tasks") if t == init_task: return work? Oleg.
On Mon, 2023-11-27 at 13:03 +0100, Oleg Nesterov wrote: > > External email : Please do not click links or open attachments until > you have verified the sender or the content. > On 11/27, Kuan-Ying Lee wrote: > > > > @@ -25,13 +25,9 @@ def task_lists(): > > t = g = init_task > > > > while True: > > - while True: > > - yield t > > - > > - t = utils.container_of(t['thread_group']['next'], > > - task_ptr_type, "thread_group") > > - if t == g: > > - break > > + thread_head = t['signal']['thread_head'] > > + for thread in lists.list_for_each_entry(thread_head, > task_ptr_type, 'thread_node'): > > + yield thread > > > > t = g = utils.container_of(g['tasks']['next'], > > task_ptr_type, "tasks") > > Thanks! > > I do not know python, but it seems that with this patch we can kill g > or t? > Can't > > def task_lists(): > task_ptr_type = task_type.get_type().pointer() > init_task = gdb.parse_and_eval("init_task").address > t = init_task > > while True: > thread_head = t['signal']['thread_head'] > for thread in lists.list_for_each_entry(thread_head, task_ptr_type, > 'thread_node'): > yield thread > > t = utils.container_of(t['tasks']['next'], > task_ptr_type, "tasks") > if t == init_task: > return > > work? Yes, you are right. I will fix it in v2. Thanks, Kuan-Ying Lee > > Oleg. >
diff --git a/scripts/gdb/linux/tasks.py b/scripts/gdb/linux/tasks.py index 17ec19e9b5bf..7c32f4c8284b 100644 --- a/scripts/gdb/linux/tasks.py +++ b/scripts/gdb/linux/tasks.py @@ -13,7 +13,7 @@ import gdb -from linux import utils +from linux import utils, lists task_type = utils.CachedType("struct task_struct") @@ -25,13 +25,9 @@ def task_lists(): t = g = init_task while True: - while True: - yield t - - t = utils.container_of(t['thread_group']['next'], - task_ptr_type, "thread_group") - if t == g: - break + thread_head = t['signal']['thread_head'] + for thread in lists.list_for_each_entry(thread_head, task_ptr_type, 'thread_node'): + yield thread t = g = utils.container_of(g['tasks']['next'], task_ptr_type, "tasks")
Since commit 8e1f385104ac ("kill task_struct->thread_group") remove the thread_group, we will encounter below issue. (gdb) lx-ps TASK PID COMM 0xffff800086503340 0 swapper/0 Python Exception <class 'gdb.error'>: There is no member named thread_group. Error occurred in Python: There is no member named thread_group. We use signal->thread_head to iterate all threads instead. Fixes: 8e1f385104ac ("kill task_struct->thread_group") Cc: stable@vger.kernel.org Signed-off-by: Kuan-Ying Lee <Kuan-Ying.Lee@mediatek.com> --- scripts/gdb/linux/tasks.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)