diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/linux-thread-db.c | 8 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/clone-thread_db.c | 73 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/clone-thread_db.exp | 37 |
5 files changed, 130 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f20593d..1a1f4ec 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2015-02-20 Pedro Alves <palves@redhat.com> + + PR threads/18006 + * linux-thread-db.c (thread_get_info_callback): Return early if + the thread's lwp id is -1. + 2015-02-20 Joel Brobecker <brobecker@adacore.com> GDB 7.9 released. diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index 6b525a0..60d8742 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -431,6 +431,14 @@ thread_get_info_callback (const td_thrhandle_t *thp, void *argp) error (_("thread_get_info_callback: cannot get thread info: %s"), thread_db_err_str (err)); + if (ti.ti_lid == -1) + { + /* We'll get this if a threaded program has a thread call clone + with CLONE_VM. `clone' sets the pthread LID of the new LWP + to -1, which ends up clearing the parent thread's LID. */ + return 0; + } + /* Fill the cache. */ thread_ptid = ptid_build (info->pid, ti.ti_lid, 0); inout->thread_info = find_thread_ptid (thread_ptid); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index a7f876e..d9a752b 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-02-20 Pedro Alves <palves@redhat.com> + + PR threads/18006 + * gdb.threads/clone-thread_db.c: New file. + * gdb.threads/clone-thread_db.exp: New file. + 2015-02-19 Antoine Tremblay <antoine.tremblay@ericsson.com> PR breakpoints/16812 diff --git a/gdb/testsuite/gdb.threads/clone-thread_db.c b/gdb/testsuite/gdb.threads/clone-thread_db.c new file mode 100644 index 0000000..4356d2f --- /dev/null +++ b/gdb/testsuite/gdb.threads/clone-thread_db.c @@ -0,0 +1,73 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2015 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + Test that GDB doesn't lose an event for a thread it didn't know + about, until an event is reported for it. */ + +#define _GNU_SOURCE +#include <sched.h> +#include <assert.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/wait.h> + +#define STACK_SIZE 0x1000 + +int clone_pid; + +static int +clone_fn (void *unused) +{ + return 0; +} + +void * +thread_fn (void *arg) +{ + unsigned char *stack; + int res; + + stack = malloc (STACK_SIZE); + assert (stack != NULL); + +#ifdef __ia64__ + clone_pid = __clone2 (clone_fn, stack, STACK_SIZE, CLONE_VM, NULL); +#else + clone_pid = clone (clone_fn, stack + STACK_SIZE, CLONE_VM, NULL); +#endif + + assert (clone_pid > 0); + + /* Wait for child. */ + res = waitpid (clone_pid, NULL, __WCLONE); + assert (res != -1); + + return NULL; +} + +int +main (int argc, char **argv) +{ + pthread_t child; + + alarm (300); + + pthread_create (&child, NULL, thread_fn, NULL); + pthread_join (child); + + return 0; +} diff --git a/gdb/testsuite/gdb.threads/clone-thread_db.exp b/gdb/testsuite/gdb.threads/clone-thread_db.exp new file mode 100644 index 0000000..621964a --- /dev/null +++ b/gdb/testsuite/gdb.threads/clone-thread_db.exp @@ -0,0 +1,37 @@ +# This testcase is part of GDB, the GNU debugger. + +# Copyright 2015 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# This only works on targets with the Linux kernel. +if ![istarget *-*-linux*] { + return +} + +standard_testfile + +if [prepare_for_testing "failed to prepare" $testfile $srcfile {debug pthreads}] { + return -1 +} + +if ![runto_main] { + untested "could not run to main" + return -1 +} + +gdb_test "break clone_fn" "Breakpoint.*at.*file.*$srcfile.*line.*" +gdb_test "continue" "clone_fn .* at .*" "continue to clone_fn" + +gdb_test "continue" "exited normally.*" "continue to end" |