From patchwork Fri Jul 24 17:36:41 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 7838 Received: (qmail 32309 invoked by alias); 24 Jul 2015 17:36:46 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 32300 invoked by uid 89); 24 Jul 2015 17:36:46 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Fri, 24 Jul 2015 17:36:44 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id BF6038AE6C for ; Fri, 24 Jul 2015 17:36:43 +0000 (UTC) Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t6OHagpG031079 for ; Fri, 24 Jul 2015 13:36:43 -0400 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [pushed] PR gdb/18717: internal error if non-leader thread exits process Date: Fri, 24 Jul 2015 18:36:41 +0100 Message-Id: <1437759401-16521-1-git-send-email-palves@redhat.com> If a non-leader thread exits the process while all other threads are ptrace-stopped, native gdb fails an assertion. The test added by this commit catches it: /home/pedro/gdb/mygit/build/../src/gdb/linux-nat.c:3198: internal-error: linux_nat_filter_event: Assertion `lp->resumed' failed. A problem internal to GDB has been detected, further debugging may prove unreliable. Quit this debugging session? (y or n) FAIL: gdb.threads/non-leader-exit-process.exp: program exits normally (GDB internal error) The fix is just to remove the assertion. With that out of the way, neither GDB not GDBserver handle this perfectly though, so I'm adding a KFAIL: (gdb) continue Continuing. [Thread 0x7ffff7fc0700 (LWP 15350) exited] No unwaited-for children left. Couldn't get registers: No such process. (gdb) KFAIL: gdb.threads/non-ldr-exit.exp: program exits normally (PRMS: gdb/18717) gdb/ChangeLog: 2015-07-24 Pedro Alves PR gdb/18717 * linux-nat.c (linux_nat_filter_event): Don't assert that the lwp is resumed, and extend the debug log. gdb/testsuite/ChangeLog: 2015-07-24 Pedro Alves PR gdb/18717 * gdb.threads/non-ldr-exit.c: New file. * gdb.threads/non-ldr-exit.exp: New file. --- gdb/ChangeLog | 6 ++++ gdb/testsuite/ChangeLog | 6 ++++ gdb/linux-nat.c | 10 ++++--- gdb/testsuite/gdb.threads/non-ldr-exit.c | 41 +++++++++++++++++++++++++++ gdb/testsuite/gdb.threads/non-ldr-exit.exp | 45 ++++++++++++++++++++++++++++++ 5 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 gdb/testsuite/gdb.threads/non-ldr-exit.c create mode 100644 gdb/testsuite/gdb.threads/non-ldr-exit.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a3fa56f..b781698 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 2015-07-24 Pedro Alves + PR gdb/18717 + * linux-nat.c (linux_nat_filter_event): Don't assert that the lwp + is resumed, and extend the debug log. + +2015-07-24 Pedro Alves + * fork-child.c (fork_inferior): Print argv[0] instead of exec_file. 2015-07-24 Pedro Alves diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 53598d6..535a540 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-07-24 Pedro Alves + + PR gdb/18717 + * gdb.threads/non-ldr-exit.c: New file. + * gdb.threads/non-ldr-exit.exp: New file. + 2015-07-24 Yao Qi * gdb.server/ext-wrapper.exp: Test --wrapper option when diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index e383d8a..b33abb0 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -3195,12 +3195,14 @@ linux_nat_filter_event (int lwpid, int status) } } - gdb_assert (lp->resumed); - + /* Note that even if the leader was ptrace-stopped, it can still + exit, if e.g., some other thread brings down the whole + process (calls `exit'). So don't assert that the lwp is + resumed. */ if (debug_linux_nat) fprintf_unfiltered (gdb_stdlog, - "Process %ld exited\n", - ptid_get_lwp (lp->ptid)); + "Process %ld exited (resumed=%d)\n", + ptid_get_lwp (lp->ptid), lp->resumed); /* This was the last lwp in the process. Since events are serialized to GDB core, we may not be able report this one diff --git a/gdb/testsuite/gdb.threads/non-ldr-exit.c b/gdb/testsuite/gdb.threads/non-ldr-exit.c new file mode 100644 index 0000000..d419640 --- /dev/null +++ b/gdb/testsuite/gdb.threads/non-ldr-exit.c @@ -0,0 +1,41 @@ +/* Clean exit of the thread group leader should not break GDB. + + 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 . */ + +#include +#include +#include +#include + +static void * +start (void *arg) +{ + exit (0); /* break-here */ + return arg; +} + +int +main (void) +{ + pthread_t thread; + int i; + + i = pthread_create (&thread, NULL, start, NULL); + assert (i == 0); + i = pthread_join (thread, NULL); + abort (); + return 0; +} diff --git a/gdb/testsuite/gdb.threads/non-ldr-exit.exp b/gdb/testsuite/gdb.threads/non-ldr-exit.exp new file mode 100644 index 0000000..d014d3c --- /dev/null +++ b/gdb/testsuite/gdb.threads/non-ldr-exit.exp @@ -0,0 +1,45 @@ +# Copyright (C) 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 . + +# Exit of the thread group leader should not break GDB. + +standard_testfile +set executable ${testfile} + +if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug pthreads}] == -1} { + return -1 +} + +if ![runto_main] { + fail "Can't run to main" + return -1 +} + +gdb_breakpoint [gdb_get_line_number "break-here"] +gdb_continue_to_breakpoint "break-here" ".* break-here .*" + +# Now lock all threads but the one that calls exit. +gdb_test_no_output "set scheduler-locking on" + +set test "program exits normally" +gdb_test_multiple "continue" $test { + -re "exited normally.*$gdb_prompt " { + pass $test + } + -re "No unwaited-for children left.*$gdb_prompt " { + setup_kfail "gdb/18717" "*-*-linux*" + fail $test + } +}