Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "Metzger, Markus T" <markus.t.metzger@intel.com>
To: Thiago Jung Bauermann <thiago.bauermann@linaro.org>
Cc: "gdb-patches@sourceware.org" <gdb-patches@sourceware.org>,
	"Aktemur, Tankut Baris" <tankut.baris.aktemur@intel.com>
Subject: RE: [PATCH v2 13/47] gdb, remote, ze: fix "$Hc-1#09...Packet received: E01" during startup
Date: Fri, 1 Aug 2025 07:55:56 +0000	[thread overview]
Message-ID: <BN0PR11MB5757812517ABAB030B209D52DE26A@BN0PR11MB5757.namprd11.prod.outlook.com> (raw)
In-Reply-To: <878qkmfhyi.fsf@linaro.org>

Hello Thiago,

Thanks for your review.

>Regarding the subject:
>
>Can you expand a bit on what conditions cause this error to happen?  Is
>it broken only for the ze target, or do other targets also get the
>error?
>
>Is it returned when, during handling of 'H', find_thread_ptid can't find
>the "<PID>.-1" thread? I.e., by this code?
>
>  else
>    {
>      /* The ptid represents a lwp/tid.  */
>      if (find_thread_ptid (thread_id) == NULL)
>        {
>          write_enn (cs.own_buf);
>          break;
>        }
>    }

It's been a while, so to answer your question I reverted the patch to
trigger the error again.  And it no longer reproduces.

I still think something is wrong, here.

>> When opening a connection, the remote target does
>>
>>     set_continue_thread (minus_one_ptid);
>
>One interesting aspect of this line is the comment above it:
>
>      /* Let the stub know that we want it to return the thread.  */
>      set_continue_thread (minus_one_ptid);
>
>What does it "the stub [...] to return the thread" mean? I tried reading
>in gdbserver code what it would do if it understood the Hc packet as
>referring to null_ptid or minus_one_ptid, but I couldn't find anything
>that could be described as "returning the thread".
>
>And yet it appears to be the purpose of the line above. I'd say we need
>someone who understands this aspect to review the patch.

Agreed.

>> which results in
>>
>>     $Hc-1#09
>>
>> to be send to gdbserver.  In remote-utils.c:read_ptid (), this is read as
>>
>>     { <current inferior>, -1, 0 }
>
>Nit: I'd say "<current PID>" rather than "<current inferior>".
>
>> and not recognized as minus_one_ptid when handling 'H' in
>>
>> 	  ptid_t thread_id = read_ptid (&cs.own_buf[2], NULL);
>>
>> 	  if (thread_id == null_ptid || thread_id == minus_one_ptid)
>> 	    thread_id = null_ptid;
>>
>> Since minus_one_ptid and null_ptid are treated the same way, this is
>> probably what we want.
>
>Not sure I understood what "this" means in the sentence. If it means "we
>want our Hc packet to be interpreted as thread_id == nullptid in the if
>condition above", then that's not what this patch does (sorry if I
>misunderstood). As you noted, read_ptid can't return a minus_one_ptid,
>but it can't return a null_ptid either.
>
>With the patch applied, read_ptid will return { <current pid>, 0, 0 },
>which ptid_t::is_pid () considers a PID and thus the handling of 'H'
>will call find_any_thread_of_pid, which I'd guess is why this patch
>works.
>
>> In remote_target::remote_resume_with_hc (), we do
>>
>>       if (ptid == minus_one_ptid)
>>         set_continue_thread (any_thread_ptid);
>>       else
>>         set_continue_thread (ptid);
>
>There's no talk of wanting the stub to "return the thread" here though.
>
>> which amounts to the same thing as set_thread () does
>
>Not exactly. In the code below, there's one more "else if" branch:
>
>>       *buf++ = 'H';
>>       *buf++ = gen ? 'g' : 'c';
>>       if (ptid == magic_null_ptid)
>>         xsnprintf (buf, endbuf - buf, "0");
>>       else if (ptid == any_thread_ptid)
>>         xsnprintf (buf, endbuf - buf, "0");
>
>  else if (ptid == minus_one_ptid)
>    xsnprintf (buf, endbuf - buf, "-1");

I argue that on the GDB side, magic_null_ptid and any_thread_ptid are
treated similarly and that on the gdbserver side minus_one_ptid and
null_ptid are treated similarly.

When resuming, GDB even turns minus_one_ptid into any_thread_ptid.

But I believe the issue lies elsewhere.

>So remote_target::set_thread doesn't treat any_thread_ptid and
>minus_one_ptid the same way, even though gdbserver apparently does.
>
>Also, the doc comment of set_thread says: "If PTID is MAGIC_NULL_PTID,
>don't set any thread.  If PTID is MINUS_ONE_PTID, set the thread to -1,
>so the stub returns the thread."
>
>Here's the talk about asking the stub to "return the thread"
>again. Frustrating.

The comment was added in

    79d7f229011     Use ptid_t.tid to store thread ids instead of ptid_t.pid.

probably based on an earlier comment at the startup set_thread() call in

    c906108c214 (tag: gdb-4_18-branchpoint) Initial creation of sourceware repository

    +  /* Let the stub know that we want it to return the thread.  */
    +  set_thread (-1, 0);
    +
    +  inferior_pid = remote_current_thread (inferior_pid);

The set_continue_thread() (or just set_thread() in earlier versions) is followed by
remote_current_thread() (also today), which sends qC to query the current thread.
This could be what is meant by the target returning the thread.

This query, however, uses the general thread, not the continue thread:

  /* Reply the current thread id.  */
  if (strcmp ("qC", own_buf) == 0 && !disable_packet_qC)
    {
      ptid_t ptid;
      require_running_or_return (own_buf);

      if (cs.general_thread != null_ptid && cs.general_thread != minus_one_ptid)
	ptid = cs.general_thread;
      else
	{
	  init_thread_iter ();
	  ptid = thread_iter->id;
	}

This special handling of the general thread was introduced in

    bd99dc85838     Non-stop mode support.

and it had always been the general thread, not the continue thread.  Before,
there was only the else part.

So, if we wanted to let the target tell us its current thread, we should really be
setting the general thread.  And it doesn't matter if we set it to null_ptid or to
minus_one_ptid.

For Hg we also see some special handling of null_ptid and minus_one_ptid,
which got turned into null_ptid earlier:

	  if (cs.own_buf[1] == 'g')
	    {
	      if (thread_id == null_ptid)
		{
		  /* GDB is telling us to choose any thread.  Check if
		     the currently selected thread is still valid. If
		     it is not, select the first available.  */
		  thread_info *thread = find_thread_ptid (cs.general_thread);
		  if (thread == NULL)
		    thread = get_first_thread ();
		  thread_id = thread->id;
		}

	      cs.general_thread = thread_id;


Maybe we could also rely on gdbserver initial state, as we're just starting,
and remove set_thread() in remote_target::start_remote_1().

It further looks like read_ptid() needs special handling for the special
thread-ids -1 and 0.

This needs more discussion.

We'll drop this patch from the series as it turned out to be unrelated.

Regards,
Markus.
Intel Deutschland GmbH
Registered Address: Am Campeon 10, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Sean Fennelly, Jeffrey Schneiderman, Tiffany Doon Silva
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928


  reply	other threads:[~2025-08-01  7:56 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-13 15:59 [PATCH v2 00/47] A new target to debug Intel GPUs Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 01/47] gdb, intelgt: add intelgt as a basic machine Tankut Baris Aktemur
2024-12-16  7:53   ` Jan Beulich
2024-12-17 18:48     ` Aktemur, Tankut Baris
2024-12-18  7:19       ` Jan Beulich
2024-12-20  9:55         ` Aktemur, Tankut Baris
2025-02-03 17:17           ` Aktemur, Tankut Baris
2025-02-04  7:06             ` Jan Beulich
2024-12-13 15:59 ` [PATCH v2 02/47] bfd: add intelgt target to BFD Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 03/47] ld: add intelgt as a target configuration Tankut Baris Aktemur
2024-12-16  7:43   ` Jan Beulich
2024-12-13 15:59 ` [PATCH v2 04/47] opcodes: add intelgt as a configuration Tankut Baris Aktemur
2024-12-16  7:44   ` Jan Beulich
2024-12-17 18:47     ` Aktemur, Tankut Baris
2024-12-18  7:22       ` Jan Beulich
2024-12-20  9:47         ` Aktemur, Tankut Baris
2025-01-03  4:46           ` Simon Marchi
2025-02-03 17:13             ` Aktemur, Tankut Baris
2025-02-04  7:07               ` Jan Beulich
2024-12-13 15:59 ` [PATCH v2 05/47] gdb, arch, intelgt: add intelgt arch definitions Tankut Baris Aktemur
2025-07-08  3:03   ` Thiago Jung Bauermann
2025-07-21 10:49     ` Aktemur, Tankut Baris
2024-12-13 15:59 ` [PATCH v2 06/47] gdb, intelgt: add the target-dependent definitions for the Intel GT architecture Tankut Baris Aktemur
2025-07-08  2:43   ` Thiago Jung Bauermann
2025-07-18 17:43     ` Aktemur, Tankut Baris
2024-12-13 15:59 ` [PATCH v2 07/47] gdb, gdbserver, gdbsupport: add 'device' tag to XML target description Tankut Baris Aktemur
2024-12-13 16:45   ` Eli Zaretskii
2025-07-08  4:04   ` Thiago Jung Bauermann
2025-07-21 10:49     ` Aktemur, Tankut Baris
2024-12-13 15:59 ` [PATCH v2 08/47] gdb, intelgt: add disassemble feature for the Intel GT architecture Tankut Baris Aktemur
2025-07-09  3:12   ` Thiago Jung Bauermann
2024-12-13 15:59 ` [PATCH v2 09/47] gdbsupport, filestuff, ze: temporary files Tankut Baris Aktemur
2025-07-14  1:26   ` Thiago Jung Bauermann
2024-12-13 15:59 ` [PATCH v2 10/47] gdb, gdbserver, ze: in-memory libraries Tankut Baris Aktemur
2025-07-14  2:35   ` Thiago Jung Bauermann
2025-07-31  6:09     ` Metzger, Markus T
2025-07-16  4:08   ` Thiago Jung Bauermann
2024-12-13 15:59 ` [PATCH v2 11/47] gdb, gdbserver, rsp, ze: acknowledge libraries Tankut Baris Aktemur
2024-12-13 16:43   ` Eli Zaretskii
2025-07-16  4:20   ` Thiago Jung Bauermann
2025-07-31  6:09     ` Metzger, Markus T
2024-12-13 15:59 ` [PATCH v2 12/47] gdb, solib, ze: solib_bfd_open_from_target_memory Tankut Baris Aktemur
2025-07-18  0:42   ` Thiago Jung Bauermann
2024-12-13 15:59 ` [PATCH v2 13/47] gdb, remote, ze: fix "$Hc-1#09...Packet received: E01" during startup Tankut Baris Aktemur
2025-07-18  0:41   ` Thiago Jung Bauermann
2025-08-01  7:55     ` Metzger, Markus T [this message]
2024-12-13 15:59 ` [PATCH v2 14/47] gdb, infrun, ze: allow saving process events Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 15/47] gdb, ze: add TARGET_WAITKIND_UNAVAILABLE Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 16/47] gdb, infrun, ze: handle stopping unavailable threads Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 17/47] gdb, infrun, ze: allow resuming " Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 18/47] gdb, gdbserver, ze: add U stop reply Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 19/47] gdb, gdbserver, ze: add library notification to " Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 20/47] gdbserver, ze: report TARGET_WAITKIND_UNAVAILABLE events Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 21/47] gdb, ze: handle TARGET_WAITKIND_UNAVAILABLE in stop_all_threads Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 22/47] gdb, remote: handle thread unavailability in print_one_stopped_thread Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 23/47] gdb, remote: do 'remote_add_inferior' in 'remote_notice_new_inferior' earlier Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 24/47] gdb, remote: handle a generic process PID in remote_notice_new_inferior Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 25/47] gdb, remote: handle a generic process PID in process_stop_reply Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 26/47] gdb: use the pid from inferior in setup_inferior Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 27/47] gdb: revise the pid_to_exec_file target op Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 28/47] gdb: load solibs if the target does not have the notion of an exec file Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 29/47] gdbserver: import AC_LIB_HAVE_LINKFLAGS macro into the autoconf script Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 30/47] gdbserver: add a pointer to the owner thread in regcache Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 31/47] gdbserver: dump 'xx...x' in collect_register_as_string for unavailable register Tankut Baris Aktemur
2024-12-23 11:38   ` Aktemur, Tankut Baris
2024-12-23 13:47     ` Luis Machado
2024-12-13 15:59 ` [PATCH v2 32/47] gdbserver: wait for stopped threads in queue_stop_reply_callback Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 33/47] gdbserver: adjust pid after the target attaches Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 34/47] gdb: do not create a thread after a process event Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 35/47] gdb, ze: on a whole process stop, mark all threads as not_resumed Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 36/47] gdb, dwarf, ze: add DW_OP_INTEL_regval_bits Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 37/47] gdbserver: allow configuring for a heterogeneous target Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 38/47] gdbserver, ze, intelgt: introduce ze-low and intel-ze-low targets Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 39/47] testsuite, sycl: add SYCL support Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 40/47] testsuite, sycl: add test for backtracing inside a kernel Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 41/47] testsuite, sycl: add test for 'info locals' and 'info args' Tankut Baris Aktemur
2024-12-13 15:59 ` [PATCH v2 42/47] testsuite, sycl: add tests for stepping and accessing data elements Tankut Baris Aktemur
2024-12-13 16:00 ` [PATCH v2 43/47] testsuite, sycl: add test for 1-D and 2-D parallel_for kernels Tankut Baris Aktemur
2024-12-13 16:00 ` [PATCH v2 44/47] testsuite, sycl: add test for scheduler-locking Tankut Baris Aktemur
2024-12-13 16:00 ` [PATCH v2 45/47] testsuite, arch, intelgt: add a disassembly test Tankut Baris Aktemur
2024-12-13 16:00 ` [PATCH v2 46/47] testsuite, arch, intelgt: add intelgt-program-bp.exp Tankut Baris Aktemur
2024-12-13 16:00 ` [PATCH v2 47/47] testsuite, sycl: test canceling a stepping flow Tankut Baris Aktemur
2025-02-07 10:18 ` [PATCH v2 00/47] A new target to debug Intel GPUs Aktemur, Tankut Baris
2025-05-08  7:40   ` Aktemur, Tankut Baris
2025-05-26  8:03     ` Aktemur, Tankut Baris
2025-06-17 12:22       ` Aktemur, Tankut Baris
2025-07-03 12:55   ` Aktemur, Tankut Baris

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=BN0PR11MB5757812517ABAB030B209D52DE26A@BN0PR11MB5757.namprd11.prod.outlook.com \
    --to=markus.t.metzger@intel.com \
    --cc=gdb-patches@sourceware.org \
    --cc=tankut.baris.aktemur@intel.com \
    --cc=thiago.bauermann@linaro.org \
    /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