From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30993 invoked by alias); 28 May 2008 18:02:03 -0000 Received: (qmail 30983 invoked by uid 22791); 28 May 2008 18:02:02 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 28 May 2008 18:01:28 +0000 Received: (qmail 4385 invoked from network); 28 May 2008 18:01:26 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 28 May 2008 18:01:26 -0000 From: Pedro Alves To: "Paul Pluzhnikov" Subject: Re: [new patch] Re: [RFC] Fix for gdb crash in "info thread" after exec(). Date: Wed, 28 May 2008 22:24:00 -0000 User-Agent: KMail/1.9.9 Cc: gdb-patches@sourceware.org References: <20080527190702.6956D3A6952@localhost> <200805281626.50992.pedro@codesourcery.com> <8ac60eac0805281009r29e394d2y2b285f31349b253f@mail.gmail.com> In-Reply-To: <8ac60eac0805281009r29e394d2y2b285f31349b253f@mail.gmail.com> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_43ZPIpaXcI+o+JD" Message-Id: <200805281901.28831.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-05/txt/msg00736.txt.bz2 --Boundary-00=_43ZPIpaXcI+o+JD Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 429 A Wednesday 28 May 2008 18:09:40, Paul Pluzhnikov wrote: > On Wed, May 28, 2008 at 8:26 AM, Pedro Alves wrote: > > What do you think? > > Looks good to me, except the "second" parameter in the test is no > longer necessary, and there is an off-by-three bug in the allocation > of new_image: > Outch! How careless am I ? :-) New patch attached. Can anyone approve (or reject) this? -- Pedro Alves --Boundary-00=_43ZPIpaXcI+o+JD Content-Type: text/x-diff; charset="iso-8859-1"; name="execl.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="execl.diff" Content-length: 5225 gdb/ 2008-05-28 Pedro Alves * linux-thread-db.c (thread_db_wait): Don't trim event ptid. testsuite/ 2008-05-28 Paul Pluzhnikov Pedro Alves * gdb.threads/execl.c, gdb.threads/execl1.c, gdb.threads/execl.exp: New tests. --- gdb/linux-thread-db.c | 2 gdb/testsuite/gdb.threads/execl.c | 38 ++++++++++++++++++ gdb/testsuite/gdb.threads/execl.exp | 75 ++++++++++++++++++++++++++++++++++++ gdb/testsuite/gdb.threads/execl1.c | 9 ++++ 4 files changed, 123 insertions(+), 1 deletion(-) Index: gdb/linux-thread-db.c =================================================================== --- gdb/linux-thread-db.c.orig 2008-05-28 18:49:15.000000000 +0100 +++ gdb/linux-thread-db.c 2008-05-28 18:49:37.000000000 +0100 @@ -838,7 +838,7 @@ thread_db_wait (ptid_t ptid, struct targ 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 Index: gdb/testsuite/gdb.threads/execl.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb/testsuite/gdb.threads/execl.c 2008-05-28 18:54:06.000000000 +0100 @@ -0,0 +1,38 @@ +/* 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; +} Index: gdb/testsuite/gdb.threads/execl.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb/testsuite/gdb.threads/execl.exp 2008-05-28 18:53:39.000000000 +0100 @@ -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" Index: gdb/testsuite/gdb.threads/execl1.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb/testsuite/gdb.threads/execl1.c 2008-05-28 18:58:00.000000000 +0100 @@ -0,0 +1,9 @@ +/* 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; +} --Boundary-00=_43ZPIpaXcI+o+JD--