From patchwork Thu Jul 30 15:29:03 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Palka X-Patchwork-Id: 7938 Received: (qmail 61626 invoked by alias); 30 Jul 2015 15:29:18 -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 61611 invoked by uid 89); 30 Jul 2015 15:29:17 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.5 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW autolearn=no version=3.3.2 X-HELO: mail-qg0-f67.google.com Received: from mail-qg0-f67.google.com (HELO mail-qg0-f67.google.com) (209.85.192.67) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Thu, 30 Jul 2015 15:29:16 +0000 Received: by qgeu79 with SMTP id u79so2598273qge.0 for ; Thu, 30 Jul 2015 08:29:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=1Job0xGsaj1X8Lg56qhO7/KyotZHmtmJoavgkm4Fh7Y=; b=c49R9ZcdQ9mkvSxJHc+2ZI5GWiPIVVYpNyEA4PgppAXJrzguNdmcGsE/Z/J/9TWxKG UZ2G2Ti49VAF5sNrn6wBDjIykDzEmdm9OJWPIUTUSCQstLPEeOu1sgOT5N9idphD7bmy XRE5jL0NIjm1pTgFlS/6O3K2deNsVteY/WOENXmYRPIRd41PmpvxWqyMAZFicjn9p9D9 pwWAuHn9ZuJzwkKkY018gQKopInKy05XpgL4i5nBqLIG7Ui+cbcNRTgsfi9eDkCaRREm z5ioYh4JHZJcQ84hrfHQQLKV20pEo9XI0cT89+SNxX5aeZZVpxjb4qLXhJKDPPQN7CU3 j/Aw== X-Gm-Message-State: ALoCoQkRcR6eSbHFkJVzRR60Q09vvuDjyXS2SxYKHNAoE9RpfESjQYWNxN+vCqy71SpTC59VLPNj X-Received: by 10.140.109.199 with SMTP id l65mr70025195qgf.91.1438270154071; Thu, 30 Jul 2015 08:29:14 -0700 (PDT) Received: from localhost.localdomain (ool-4353acd8.dyn.optonline.net. [67.83.172.216]) by smtp.gmail.com with ESMTPSA id v44sm618666qgd.21.2015.07.30.08.29.13 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 30 Jul 2015 08:29:13 -0700 (PDT) From: Patrick Palka To: gdb-patches@sourceware.org Cc: Patrick Palka Subject: [PATCH] Fix invoking "[kill|detach] inferiors" on inferiors that are not running Date: Thu, 30 Jul 2015 11:29:03 -0400 Message-Id: <1438270143-23621-1-git-send-email-patrick@parcs.ath.cx> Invoking either of the above commands on an inferior that's not running triggers the following assert failure: .../binutils-gdb/gdb/thread.c:514: internal-error: any_thread_of_process: Assertion `pid != 0' failed. The fix is straightforward. This patch adds a test to check the basic functionality of these commands, along with testing this fix in particular. Tested on x86_64 Linux. gdb/ChangeLog: * inferior.c (detach_inferior_command): Don't call any_thread_of_process when pid is 0. (kill_inferior_command): Likewise. gdb/testsuite/ChangeLog: * gdb.base/kill-detach-inferiors-cmd.exp: New test file. * gdb.base/kill-detach-inferiors-cmd.c: New test file. --- gdb/inferior.c | 10 ++++ gdb/testsuite/gdb.base/kill-detach-inferiors-cmd.c | 25 +++++++++ .../gdb.base/kill-detach-inferiors-cmd.exp | 60 ++++++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 gdb/testsuite/gdb.base/kill-detach-inferiors-cmd.c create mode 100644 gdb/testsuite/gdb.base/kill-detach-inferiors-cmd.exp diff --git a/gdb/inferior.c b/gdb/inferior.c index 5e98df5..2e44f17 100644 --- a/gdb/inferior.c +++ b/gdb/inferior.c @@ -625,6 +625,11 @@ detach_inferior_command (char *args, int from_tty) } pid = gdb_inferior_id_to_pid (num); + if (pid == 0) + { + warning (_("Inferior ID %d is not running."), num); + continue; + } tp = any_thread_of_process (pid); if (!tp) @@ -661,6 +666,11 @@ kill_inferior_command (char *args, int from_tty) } pid = gdb_inferior_id_to_pid (num); + if (pid == 0) + { + warning (_("Inferior ID %d is not running."), num); + continue; + } tp = any_thread_of_process (pid); if (!tp) diff --git a/gdb/testsuite/gdb.base/kill-detach-inferiors-cmd.c b/gdb/testsuite/gdb.base/kill-detach-inferiors-cmd.c new file mode 100644 index 0000000..2398f00 --- /dev/null +++ b/gdb/testsuite/gdb.base/kill-detach-inferiors-cmd.c @@ -0,0 +1,25 @@ +/* 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 . */ + +#include + +int +main (void) +{ + sleep (600); + return 0; +} diff --git a/gdb/testsuite/gdb.base/kill-detach-inferiors-cmd.exp b/gdb/testsuite/gdb.base/kill-detach-inferiors-cmd.exp new file mode 100644 index 0000000..eb0fd3b --- /dev/null +++ b/gdb/testsuite/gdb.base/kill-detach-inferiors-cmd.exp @@ -0,0 +1,60 @@ +# 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 . + +# Test the basic operation of the "kill inferiors" and "detach inferiors" commands. + +if ![can_spawn_for_attach] { + return 0 +} + +standard_testfile +set executable $testfile + +if [prepare_for_testing $testfile.exp $executable] { + return -1 +} + +runto_main + +# Add another forked inferior process. +gdb_test "add-inferior" "Added inferior 2" "add inferior 2" +gdb_test "inferior 2" "Switching to inferior 2.*" +gdb_test "file $binfile" "Reading symbols from .*done.*" "load binary" +gdb_test "start" "Temporary breakpoint.*Starting program.*" + +# Add an attached inferior process. +set testpid [spawn_wait_for_attach $binfile] +gdb_test "add-inferior" "Added inferior 3" "add inferior 3" +gdb_test "inferior 3" "Switching to inferior 3.*" +gdb_test "attach $testpid" "Attaching to process.*" "attach to pid" + +# Kill the first two inferiors, and detach the third. +gdb_test_no_output "kill inferiors 1 2" +gdb_test "inferior 1" "Switching to inferior 1.*" +gdb_test "kill" "The program is not being run.*" +gdb_test "detach inferiors 3" "Detaching from program.*process $testpid.*" + +# No inferiors should be running anymore. +gdb_test "kill inferiors 1 2 3" \ + "ID 1 is not running.*ID 2 is not running.*ID 3 is not running.*" +gdb_test "detach inferiors 1 2 3" \ + "ID 1 is not running.*ID 2 is not running.*ID 3 is not running.*" + +gdb_test "kill inferiors 10" \ + "ID 10 not known.*" + +remote_exec host "kill $testpid"