[gdbserver/LynxOS]: Incomplete thread list after --attach

The current implementation is forgetting to populate the thread list
when attaching to the process. This results in an incomplete list of
threads when debugging a threaded program.

Unfortunately, as the added comments hints, there appears to be
no way of getting the list of threads via ptrace, other than by
spawning the "ps" command, and parsing its output. Not great,
but it appears to be the best we can do.

gdb/gdbserver/ChangeLog:

        * lynx-low.c (lynx_add_threads_after_attach): New function.
        (lynx_attach): Remove call to add_thread.  Add call to
        lynx_add_threads_after_attach instead.
This commit is contained in:
Joel Brobecker 2013-10-01 10:56:51 +00:00
parent e39462cbbb
commit 97ad458125
2 changed files with 43 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2013-10-01 Joel Brobecker <brobecker@adacore.com>
* lynx-low.c (lynx_add_threads_after_attach): New function.
(lynx_attach): Remove call to add_thread. Add call to
lynx_add_threads_after_attach instead.
2013-09-28 Mike Frysinger <vapier@gentoo.org>
* configure.ac (AC_CHECK_HEADERS): Add sys/syscall.h

View File

@ -262,6 +262,42 @@ lynx_create_inferior (char *program, char **allargs)
return pid;
}
/* Assuming we've just attached to a running inferior whose pid is PID,
add all threads running in that process. */
static void
lynx_add_threads_after_attach (int pid)
{
/* Ugh! There appears to be no way to get the list of threads
in the program we just attached to. So get the list by calling
the "ps" command. This is only needed now, as we will then
keep the thread list up to date thanks to thread creation and
exit notifications. */
FILE *f;
char buf[256];
int thread_pid, thread_tid;
f = popen ("ps atx", "r");
if (f == NULL)
perror_with_name ("Cannot get thread list");
while (fgets (buf, sizeof (buf), f) != NULL)
if ((sscanf (buf, "%d %d", &thread_pid, &thread_tid) == 2
&& thread_pid == pid))
{
ptid_t thread_ptid = lynx_ptid_build (pid, thread_tid);
if (!find_thread_ptid (thread_ptid))
{
lynx_debug ("New thread: (pid = %d, tid = %d)",
pid, thread_tid);
add_thread (thread_ptid, NULL);
}
}
pclose (f);
}
/* Implement the attach target_ops method. */
static int
@ -274,7 +310,7 @@ lynx_attach (unsigned long pid)
strerror (errno), errno);
lynx_add_process (pid, 1);
add_thread (ptid, NULL);
lynx_add_threads_after_attach (pid);
return 0;
}