From 49fd4a422bb6152043b2b41a1f734694056dbf3b Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Thu, 5 Jun 2008 21:03:59 +0000 Subject: gdb/ * linux-thread-db.c (thread_db_wait): Don't trim event ptid. testsuite/ * gdb.threads/execl.c, gdb.threads/execl1.c, gdb.threads/execl.exp: New tests. --- gdb/ChangeLog | 4 ++ gdb/linux-thread-db.c | 2 +- gdb/testsuite/ChangeLog | 6 +++ gdb/testsuite/gdb.threads/execl.c | 56 +++++++++++++++++++++++++++ gdb/testsuite/gdb.threads/execl.exp | 75 +++++++++++++++++++++++++++++++++++++ gdb/testsuite/gdb.threads/execl1.c | 27 +++++++++++++ 6 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.threads/execl.c create mode 100644 gdb/testsuite/gdb.threads/execl.exp create mode 100644 gdb/testsuite/gdb.threads/execl1.c diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0750025..bb7fd13 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2008-06-05 Pedro Alves + + * linux-thread-db.c (thread_db_wait): Don't trim event ptid. + 2008-06-05 Aleksandar Ristovski * bcache.c (bcache_data): Call deprecated_bcache_added function. diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index 2ae2f5c..7e40e9f 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -838,7 +838,7 @@ thread_db_wait (ptid_t ptid, struct target_waitstatus *ourstatus) unpush_target (&thread_db_ops); using_thread_db = 0; - return pid_to_ptid (GET_PID (ptid)); + return ptid; } /* If we do not know about the main thread yet, this would be a good time to diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 8bf0e0f..79ead39 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2008-06-05 Paul Pluzhnikov + Pedro Alves + + * gdb.threads/execl.c, gdb.threads/execl1.c, + gdb.threads/execl.exp: New tests. + 2008-06-05 Aleksandar Ristovski Daniel Jacobowitz diff --git a/gdb/testsuite/gdb.threads/execl.c b/gdb/testsuite/gdb.threads/execl.c new file mode 100644 index 0000000..a90c2ad --- /dev/null +++ b/gdb/testsuite/gdb.threads/execl.c @@ -0,0 +1,56 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2008 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 . +*/ + +/* Test handling thread control across an execl. */ + +/* The original image loads a thread library and has several threads, + while the new image does not load a thread library. */ + +#include +#include +#include +#include +#include + +void * +thread_function (void *arg) +{ + while (1) + sleep (100); + return NULL; +} + +int +main (int argc, char* argv[]) +{ + pthread_t thread1; + pthread_t thread2; + char *new_image; + + pthread_create (&thread1, NULL, thread_function, NULL); + pthread_create (&thread2, NULL, thread_function, NULL); + + new_image = malloc (strlen (argv[0]) + 2); + strcpy (new_image, argv[0]); + strcat (new_image, "1"); + + if (execl (new_image, new_image, NULL) == -1) /* set breakpoint here */ + return 1; + + return 0; +} diff --git a/gdb/testsuite/gdb.threads/execl.exp b/gdb/testsuite/gdb.threads/execl.exp new file mode 100644 index 0000000..5dafb8c --- /dev/null +++ b/gdb/testsuite/gdb.threads/execl.exp @@ -0,0 +1,75 @@ +# Copyright (C) 2008 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 . + +# Test handling of threads across an execl. + + +# Original image, loads a thread library. +set testfile "execl" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + return -1 +} + +# New image, that does not load a thread library. +set testfile1 "execl1" +set srcfile1 ${testfile1}.c +set binfile1 ${objdir}/${subdir}/${testfile1} + +if {[gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile1}" executable {debug}] != "" } { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +runto_main + +gdb_test "b [gdb_get_line_number "breakpoint here"]" \ + ".*Breakpoint .*execl.*" "set breakpoint at execl" + +gdb_test "continue" ".*breakpoint here.*" "continue to exec" + +gdb_test "info threads" ".*3 Thread.*2 Thread.*1 Thread.*" "info threads before exec" + +# When continuing from this point we'll hit the breakpoint in main() +# again, this time in the exec'd process. +gdb_test "continue" ".*Breakpoint 1, main.*" \ + "continue across exec" + +gdb_test "info threads" ".*" "info threads after exec" + +set test "info threads after exec" +gdb_test_multiple "info threads" "$test" { + -re "2 Thread .*$gdb_prompt $" { + # Old threads left behind. + fail "$test" + } + -re "4 Thread .*$gdb_prompt $" { + # New threads registered. + fail "$test" + } + -re "$gdb_prompt $" { + # Target doesn't register the main thread, pass for now. + pass "$test" + } +} + +gdb_test "continue" ".*Program exited normally\\." \ + "continue to end" diff --git a/gdb/testsuite/gdb.threads/execl1.c b/gdb/testsuite/gdb.threads/execl1.c new file mode 100644 index 0000000..57ee446 --- /dev/null +++ b/gdb/testsuite/gdb.threads/execl1.c @@ -0,0 +1,27 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2008 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 . +*/ + +/* Test handling thread control across an execl. */ + +/* New exec image that doesn't load any thread library. */ + +int +main (int argc, char* argv[]) +{ + return 0; +} -- cgit v1.1