From: Pedro Alves <palves@redhat.com>
To: gdb-patches@sourceware.org
Subject: [PATCH 04/18] gdbserver crash running gdb.threads/non-ldr-exc-1.exp
Date: Wed, 14 Oct 2015 15:36:00 -0000 [thread overview]
Message-ID: <1444836486-25679-5-git-send-email-palves@redhat.com> (raw)
In-Reply-To: <1444836486-25679-1-git-send-email-palves@redhat.com>
This fixes a gdbserver crash when running
gdb.threads/non-ldr-exc-1.exp with "maint set target-non-stop on".
The problem is that qSymbol is called when gdbserver has
current_thread == NULL.
gdb/gdbserver/ChangeLog:
2015-10-14 Pedro Alves <palves@redhat.com>
* gdbthread.h (find_any_thread_of_pid): Declare.
* inferiors.c (thread_of_pid, find_any_thread_of_pid): New
functions.
* server.c (handle_query): If current_thread is NULL, look for
another thread of the selected process.
---
gdb/gdbserver/gdbthread.h | 4 ++++
gdb/gdbserver/inferiors.c | 23 +++++++++++++++++++++++
gdb/gdbserver/server.c | 23 +++++++++++++++++++++++
3 files changed, 50 insertions(+)
diff --git a/gdb/gdbserver/gdbthread.h b/gdb/gdbserver/gdbthread.h
index d6959f4..0510419 100644
--- a/gdb/gdbserver/gdbthread.h
+++ b/gdb/gdbserver/gdbthread.h
@@ -80,6 +80,10 @@ struct thread_info *get_first_thread (void);
struct thread_info *find_thread_ptid (ptid_t ptid);
+/* Find any thread of the PID process. Returns NULL if none is
+ found. */
+struct thread_info *find_any_thread_of_pid (int pid);
+
/* Get current thread ID (Linux task ID). */
#define current_ptid (current_thread->entry.id)
diff --git a/gdb/gdbserver/inferiors.c b/gdb/gdbserver/inferiors.c
index 21f45fa..84f5b7c 100644
--- a/gdb/gdbserver/inferiors.c
+++ b/gdb/gdbserver/inferiors.c
@@ -141,6 +141,29 @@ find_thread_ptid (ptid_t ptid)
return (struct thread_info *) find_inferior_id (&all_threads, ptid);
}
+/* Helper for find_any_thread_of_pid. Returns true if a thread
+ matches a PID. */
+
+static int
+thread_of_pid (struct inferior_list_entry *entry, void *pid_p)
+{
+ int pid = *(int *) pid_p;
+
+ return (ptid_get_pid (entry->id) == pid);
+}
+
+/* See gdbthread.h. */
+
+struct thread_info *
+find_any_thread_of_pid (int pid)
+{
+ struct inferior_list_entry *entry;
+
+ entry = find_inferior (&all_threads, thread_of_pid, &pid);
+
+ return (struct thread_info *) entry;
+}
+
ptid_t
gdb_id_to_thread_id (ptid_t gdb_id)
{
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index e25b7c7..ec52f84 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -1971,6 +1971,27 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
if (strcmp ("qSymbol::", own_buf) == 0)
{
+ struct thread_info *save_thread = current_thread;
+
+ /* For qSymbol, GDB only changes the current thread if the
+ previous current thread was of a different process. So if
+ the previous thread is gone, we need to pick another one of
+ the same process. This can happen e.g., if we followed an
+ exec in a non-leader thread. */
+ if (current_thread == NULL)
+ {
+ current_thread = find_any_thread_of_pid (ptid_get_pid (general_thread));
+
+ /* Just in case, if we didn't find a thread, then bail out
+ instead of crashing. */
+ if (current_thread == NULL)
+ {
+ write_enn (own_buf);
+ current_thread = save_thread;
+ return;
+ }
+ }
+
/* GDB is suggesting new symbols have been loaded. This may
mean a new shared library has been detected as loaded, so
take the opportunity to check if breakpoints we think are
@@ -1989,6 +2010,8 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
if (current_thread != NULL && the_target->look_up_symbols != NULL)
(*the_target->look_up_symbols) ();
+ current_thread = save_thread;
+
strcpy (own_buf, "OK");
return;
}
--
1.9.3
next prev parent reply other threads:[~2015-10-14 15:36 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-14 15:28 [PATCH 00/18] Remote all-stop on top of non-stop Pedro Alves
2015-10-14 15:28 ` [PATCH 03/18] attach + target always in non-stop mode: stop all threads Pedro Alves
2015-10-26 13:22 ` Yao Qi
2015-11-23 18:15 ` Pedro Alves
2015-11-23 18:42 ` Pedro Alves
2015-11-26 16:12 ` Yao Qi
2015-11-26 16:23 ` Pedro Alves
2015-11-27 9:33 ` Yao Qi
2015-10-14 15:28 ` [PATCH 13/18] infrun: Fix TARGET_WAITKIND_NO_RESUMED handling in non-stop mode Pedro Alves
2015-10-14 15:28 ` [PATCH 01/18] Fix mi-nonstop.exp with extended-remote Pedro Alves
2015-10-14 15:28 ` [PATCH 18/18] remote: enable "maint set target-non-stop" by default Pedro Alves
2015-10-14 15:28 ` [PATCH 15/18] gdbserver:prepare_access_memory: pick another thread Pedro Alves
2015-10-14 15:28 ` [PATCH 02/18] Remote all-stop-on-top-of-non-stop Pedro Alves
2015-10-24 22:39 ` Yao Qi
2015-11-23 15:40 ` Pedro Alves
2015-11-23 18:39 ` Pedro Alves
2015-11-26 15:53 ` Yao Qi
2015-10-14 15:33 ` [PATCH 10/18] Remote thread create/exit events Pedro Alves
2015-10-14 16:35 ` Eli Zaretskii
2015-10-26 16:50 ` Yao Qi
2015-11-23 15:41 ` Pedro Alves
2015-12-01 15:12 ` Ulrich Weigand
2015-12-01 16:06 ` Pedro Alves
2015-12-01 17:10 ` Ulrich Weigand
2015-10-14 15:33 ` [PATCH 05/18] remote: stop reason and watchpoint data address per thread Pedro Alves
2015-10-14 15:36 ` [PATCH 14/18] Implement TARGET_WAITKIND_NO_RESUMED in the remote protocol Pedro Alves
2015-10-14 16:36 ` Eli Zaretskii
2015-10-19 16:21 ` Yao Qi
2015-10-19 16:48 ` Pedro Alves
2015-10-14 15:36 ` [PATCH 06/18] New vCtrlC packet, non-stop mode equivalent of \003 Pedro Alves
2015-10-26 14:11 ` Yao Qi
2015-11-30 18:25 ` Pedro Alves
2015-10-14 15:36 ` Pedro Alves [this message]
2015-10-26 13:54 ` [PATCH 04/18] gdbserver crash running gdb.threads/non-ldr-exc-1.exp Yao Qi
2015-11-24 16:34 ` Pedro Alves
2015-11-26 16:23 ` Yao Qi
2015-11-30 14:53 ` Pedro Alves
2015-10-14 15:36 ` [PATCH 12/18] testsuite: Range stepping and non-stop mode Pedro Alves
2015-10-14 15:36 ` [PATCH 11/18] gdbserver: fix killed-outside.exp Pedro Alves
2015-10-27 12:02 ` Yao Qi
2015-11-25 15:06 ` Pedro Alves
2015-11-26 16:51 ` Yao Qi
2015-11-26 17:56 ` Pedro Alves
2015-10-14 15:36 ` [PATCH 17/18] gdbserver: don't exit until GDB disconnects Pedro Alves
2015-10-14 15:37 ` [PATCH 07/18] gdbserver crash if gdb attaches too fast Pedro Alves
2015-10-14 15:37 ` [PATCH 16/18] gdbserver/linux: Always wake up event loop after resume Pedro Alves
2015-10-26 17:28 ` Yao Qi
2015-11-25 15:31 ` Pedro Alves
2015-10-14 15:37 ` [PATCH 09/18] Make dprintf-non-stop.exp cope with remote testing Pedro Alves
2015-10-14 15:38 ` [PATCH 08/18] gdbserver resume_stop handling bug Pedro Alves
2015-10-14 16:37 ` Eli Zaretskii
2015-11-25 15:12 ` Pedro Alves
2015-11-25 17:53 ` Eli Zaretskii
2015-10-15 10:46 ` [PATCH 00/18] Remote all-stop on top of non-stop Pedro Alves
2015-10-16 16:47 ` Yao Qi
2015-10-19 11:48 ` Yao Qi
2015-10-19 15:28 ` Pedro Alves
2015-10-19 15:47 ` Yao Qi
2015-10-27 13:11 ` Yao Qi
2015-11-30 19:59 ` 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=1444836486-25679-5-git-send-email-palves@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.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