+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.
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);
+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
--- /dev/null
+/* 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;
+}
--- /dev/null
+# 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"