From: "Metzger, Markus T" <markus.t.metzger@intel.com>
To: Simon Marchi <simark@simark.ca>
Cc: "gdb-patches@sourceware.org" <gdb-patches@sourceware.org>
Subject: RE: [PATCH] gdb: fix an issue with thread list corruption
Date: Wed, 6 May 2026 05:43:29 +0000 [thread overview]
Message-ID: <DM8PR11MB574955D07930752047CC73B2DE3F2@DM8PR11MB5749.namprd11.prod.outlook.com> (raw)
In-Reply-To: <6ff2ff67-e93c-41b0-b55a-2ec6462e6061@simark.ca>
Hello Simon,
>>> On 5/4/26 3:16 AM, Markus Metzger wrote:
>>>> When resuming a target in non-stop mode with 'c -a', the continue
>>> command
>>>> uses for_each_thread() to proceed each stopped thread individually. This
>>>> uses an all_threads_safe() iteration.
>>>>
>>>> If one of the stopped threads does an inline step-over, since the target
>>>> is non-stop, we stop_all_threads(), which involves update_thread_list(),
>>>> which, in turn, may delete_thread().
>>>>
>>>> If this deleted the thread pointed to by the m_next safe iterator member,
>>>> the above all_threads_safe() iteration will be corrupted.
>>>>
>>>> The thread we're proceeding is stopped and there is no reason to delete
>>>> it. Consequently, there is no reason for all_threads_safe(), which isn't
>>>> that safe in this scenario.
>>>>
>>>> Iterate using all_threads() and inline proceed_thread_callback().
>>>
>>> Just to try to make sure I understand the circumstances that lead the
>>> the failure correcty (and make sure this doesn't just cover up other
>>> problems):
>>>
>>> - thread 1 is stopped on a breakpoint
>>> - thread 2 is executing
>>> - displaced stepping is disabled
>>> - the target doesn't report thread events to the core
>>> - you "continue -a"
>>> - thread 1 starts an inline step-over, which calls stop_all_threads,
>>> which calls update_thread_list
>>> - meanwhile, thread 2 exits
>>> - update_thread_list causes thread 2 to be deleted
>>> - the safe iterator's m_next field now points to a deleted thread info
>
>Can you comment on whether the sequence of events above sounds correct?
>If it is, I think it would be possible to write a CPU test to reproduce
>it, that would be helpful along with the fix.
The sequence sounds good, but I wonder how we would ensure that thread 2
exits just when we need it to. This is non-stop mode, so we should learn about
the exit immediately. The test would also need to rely on the ordering of threads
in the thread list. And detecting the issue requires the next pointer of the next
element to be overwritten in a way that causes a deterministic effect - like crashing
GDB. We wouldn't want to add another test that fails sporadically.
When looking at the safe-iterator code, it is obvious that it allows deleting the
current element and it does not allow deleting the next element. So, nesting
safe-iterator iterations of the same list is a bad idea.
Regards,
Markus.
Intel Deutschland GmbH
Registered Address: Dornacher Strasse 1, 85622 Feldkirchen, Germany
Tel: +49 89 991 430, www.intel.de
Managing Directors: Harry Demas, Jeffrey Schneiderman, Yin Chong Sorrell
Chairperson of the Supervisory Board: Nicole Lau
Registered Seat: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928
next prev parent reply other threads:[~2026-05-06 10:36 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-04 7:16 [PATCH] gdb, btrace: fix wrong #endif comments Markus Metzger
2026-05-04 7:16 ` [PATCH] gdb: fix an issue with thread list corruption Markus Metzger
2026-05-04 15:30 ` Simon Marchi
2026-05-05 5:04 ` Metzger, Markus T
2026-05-05 15:51 ` Simon Marchi
2026-05-06 5:43 ` Metzger, Markus T [this message]
2026-05-06 18:36 ` Simon Marchi
2026-05-07 7:36 ` Metzger, Markus T
2026-05-07 15:11 ` Simon Marchi
2026-05-11 7:25 ` Metzger, Markus T
2026-05-11 10:05 ` Metzger, Markus T
2026-05-12 6:36 ` Metzger, Markus T
2026-05-13 14:33 ` Tom Tromey
2026-05-13 17:05 ` Tom Tromey
2026-05-14 22:07 ` Thiago Jung Bauermann
2026-05-04 7:16 ` [PATCH] gdb, remote: fix notify debug nullptr dereference Markus Metzger
2026-05-04 15:40 ` Simon Marchi
2026-05-04 7:16 ` [PATCH] gdb, testsuite: increase timeout in gdb.threads/attach-non-stop.exp Markus Metzger
2026-05-04 15:49 ` Simon Marchi
2026-05-05 6:15 ` Metzger, Markus T
2026-05-05 15:54 ` Simon Marchi
2026-05-06 6:33 ` Metzger, Markus T
2026-05-04 7:16 ` [PATCH] gdb: update store_integer's comment Markus Metzger
2026-05-04 15:52 ` Simon Marchi
2026-05-04 7:16 ` [PATCH] gdb: use correct target in notify_thread_exited() Markus Metzger
2026-05-04 16:06 ` Simon Marchi
2026-05-05 7:56 ` Metzger, Markus T
2026-05-05 16:10 ` Simon Marchi
2026-05-06 6:56 ` Metzger, Markus T
2026-05-04 7:16 ` [PATCH v2] gdb, btrace: support libipt v2.2 events Markus Metzger
2026-05-04 12:08 ` Eli Zaretskii
2026-05-04 14:00 ` Metzger, Markus T
2026-05-04 15:04 ` Eli Zaretskii
2026-05-05 4:32 ` Metzger, Markus T
2026-05-05 5:12 ` Eli Zaretskii
2026-05-04 14:44 ` [PATCH] gdb, btrace: fix wrong #endif comments Simon Marchi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DM8PR11MB574955D07930752047CC73B2DE3F2@DM8PR11MB5749.namprd11.prod.outlook.com \
--to=markus.t.metzger@intel.com \
--cc=gdb-patches@sourceware.org \
--cc=simark@simark.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox