From: Pedro Alves <palves@redhat.com>
To: Sandra Loosemore <sandra@codesourcery.com>
Cc: gdb-patches@sourceware.org
Subject: [pushed] Workaround remote targets that report an empty list to qfThreadInfo (Re: Cannot execute this command without a live selected thread.)
Date: Tue, 28 Oct 2014 12:10:00 -0000 [thread overview]
Message-ID: <544F8792.5050800@redhat.com> (raw)
In-Reply-To: <544EA2C9.8090902@codesourcery.com>
On 10/27/2014 07:53 PM, Sandra Loosemore wrote:
> On 10/24/2014 11:40 AM, Pedro Alves wrote:
>>
>> Please give this a try.
>>
>> From 2062235a91a3c69e73c39b0f8a4f78f4ec396931 Mon Sep 17 00:00:00 2001
>> From: Pedro Alves <palves@redhat.com>
>> Date: Fri, 24 Oct 2014 18:27:14 +0100
>> Subject: [PATCH] gdb/ 2014-10-24 Pedro Alves <palves@redhat.com>
>>
>> * remote.c (remote_thread_alive): New, factored out from ...
>> (remote_thread_alive): ... this.
>> (remote_update_thread_list): Bail out before deleting threads if
>> the target returned an empty list, and, the current thread has a
>> magic/fake ptid.
>
> This worked for me. The remaining ERRORs in the nios2-elf test results
> are due to the GCC switch to C11.
Thanks Sandra, now pushed.
From 7d1a114c44db3d7055afe48868f939ba95a64b7b Mon Sep 17 00:00:00 2001
From: Pedro Alves <palves@redhat.com>
Date: Tue, 28 Oct 2014 11:35:10 +0000
Subject: [PATCH] Workaround remote targets that report an empty list to
qfThreadInfo
In https://sourceware.org/ml/gdb-patches/2014-10/msg00652.html, Sandra
shows a target that was broken by the recent update_thread_list
optimization:
(gdb) target remote qa8-centos32-cs:10514
...
(gdb) continue
Continuing.
Cannot execute this command without a live selected thread.
(gdb)
The error means that the current thread is in "exited" state when the
continue command is processed. The root of the problem was found
here:
> Sending packet: $Hg0#df...Packet received:
...
> Sending packet: $?#3f...Packet received: S00
> Sending packet: $qfThreadInfo#bb...Packet received: l
> Sending packet: $Hc-1#09...Packet received:
> Sending packet: $qC#b4...Packet received: unset
This target doesn't really support threads (no thread indication in
stop reply packets; no support for qC), but then supports
qfThreadInfo, and returns an empty thread list to GDB.
See https://sourceware.org/ml/gdb-patches/2014-10/msg00665.html for
why the target does that.
As remote_update_thread_list deletes threads from GDB's list that are
not found in the thread list that the target reports, the result is
that GDB deletes the "fake" main thread that GDB added itself. (As
that thread is currently selected, it is marked "exited" instead of
being deleted straight away.)
This commit avoids deleting the main thread in this scenario.
gdb/
2014-10-27 Pedro Alves <palves@redhat.com>
* remote.c (remote_thread_alive): New, factored out from ...
(remote_thread_alive): ... this.
(remote_update_thread_list): Bail out before deleting threads if
the target returned an empty list, and, the current thread has a
magic/fake ptid.
---
gdb/ChangeLog | 8 ++++++++
gdb/remote.c | 35 ++++++++++++++++++++++++++++++++---
2 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 8a34118..b358dd7 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
2014-10-27 Pedro Alves <palves@redhat.com>
+ * remote.c (remote_thread_alive): New, factored out from ...
+ (remote_thread_alive): ... this.
+ (remote_update_thread_list): Bail out before deleting threads if
+ the target returned an empty list, and, the current thread has a
+ magic/fake ptid.
+
+2014-10-27 Pedro Alves <palves@redhat.com>
+
* infrun.c (handle_signal_stop): Also skip handlers when a random
signal arrives while handling a "stepi" or a "nexti". Set the
thread's 'step_after_step_resume_breakpoint' flag.
diff --git a/gdb/remote.c b/gdb/remote.c
index 20f2988..4b9b099 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -1842,11 +1842,11 @@ set_general_process (void)
}
\f
-/* Return nonzero if the thread PTID is still alive on the remote
- system. */
+/* Return nonzero if this is the main thread that we made up ourselves
+ to model non-threaded targets as single-threaded. */
static int
-remote_thread_alive (struct target_ops *ops, ptid_t ptid)
+remote_thread_always_alive (struct target_ops *ops, ptid_t ptid)
{
struct remote_state *rs = get_remote_state ();
char *p, *endp;
@@ -1861,6 +1861,23 @@ remote_thread_alive (struct target_ops *ops, ptid_t ptid)
multi-threading. */
return 1;
+ return 0;
+}
+
+/* Return nonzero if the thread PTID is still alive on the remote
+ system. */
+
+static int
+remote_thread_alive (struct target_ops *ops, ptid_t ptid)
+{
+ struct remote_state *rs = get_remote_state ();
+ char *p, *endp;
+
+ /* Check if this is a thread that we made up ourselves to model
+ non-threaded targets as single-threaded. */
+ if (remote_thread_always_alive (ops, ptid))
+ return 1;
+
p = rs->buf;
endp = rs->buf + get_remote_packet_size ();
@@ -2780,6 +2797,18 @@ remote_update_thread_list (struct target_ops *ops)
got_list = 1;
+ if (VEC_empty (thread_item_t, context.items)
+ && remote_thread_always_alive (ops, inferior_ptid))
+ {
+ /* Some targets don't really support threads, but still
+ reply an (empty) thread list in response to the thread
+ listing packets, instead of replying "packet not
+ supported". Exit early so we don't delete the main
+ thread. */
+ do_cleanups (old_chain);
+ return;
+ }
+
/* CONTEXT now holds the current thread list on the remote
target end. Delete GDB-side threads no longer found on the
target. */
--
1.9.3
next prev parent reply other threads:[~2014-10-28 12:10 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-24 15:55 Cannot execute this command without a live selected thread Sandra Loosemore
2014-10-24 16:07 ` Pedro Alves
2014-10-24 17:08 ` Sandra Loosemore
2014-10-24 17:23 ` Pedro Alves
2014-10-24 17:40 ` Pedro Alves
2014-10-24 19:02 ` Sandra Loosemore
2014-10-24 19:19 ` Doug Evans
2014-10-24 19:40 ` Pedro Alves
2014-10-24 20:02 ` Doug Evans
2014-10-24 20:20 ` Pedro Alves
2014-10-24 20:38 ` Doug Evans
2014-10-24 20:52 ` Remove libthread_db -> remove thread_stratum? [was Re: Cannot execute this command without a live selected thread.] Doug Evans
2014-10-24 22:07 ` Cannot execute this command without a live selected thread Pedro Alves
2014-10-27 19:53 ` Sandra Loosemore
2014-10-28 12:10 ` Pedro Alves [this message]
2014-10-29 19:16 ` [pushed] Workaround remote targets that report an empty list to qfThreadInfo (Re: Cannot execute this command without a live selected thread.) Doug Evans
2014-10-24 17:57 ` Cannot execute this command without a live selected thread Sandra Loosemore
2014-10-24 18:15 ` Pedro Alves
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=544F8792.5050800@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=sandra@codesourcery.com \
/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