From e3ae3c4345fa14f2f3b0b2c5d4d23760af9f74f5 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Tue, 28 Jul 2015 15:00:58 -0400 Subject: [PATCH] Fix invoking "[kill|detach] inferiors" on inferiors that are not running 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 also 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/ChangeLog | 6 ++ gdb/inferior.c | 10 +++ gdb/testsuite/ChangeLog | 5 ++ .../gdb.base/kill-detach-inferiors-cmd.c | 25 ++++++++ .../gdb.base/kill-detach-inferiors-cmd.exp | 62 +++++++++++++++++++ 5 files changed, 108 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/ChangeLog b/gdb/ChangeLog index 298f44d7f18..e983e30048b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2015-08-15 Patrick Palka + + * inferior.c (detach_inferior_command): Don't call + any_thread_of_process when pid is 0. + (kill_inferior_command): Likewise. + 2015-08-14 Doug Evans PR gdb/11833 diff --git a/gdb/inferior.c b/gdb/inferior.c index 5e98df58942..2e44f175bb1 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/ChangeLog b/gdb/testsuite/ChangeLog index 5022fe2f86f..37ed04303cf 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-08-15 Patrick Palka + + * gdb.base/kill-detach-inferiors-cmd.exp: New test file. + * gdb.base/kill-detach-inferiors-cmd.c: New test file. + 2015-08-14 Doug Evans * gdb.perf/lib/perftest/utils.py (select_file): Kill any existing 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 00000000000..2398f004425 --- /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 00000000000..c6bb11bd382 --- /dev/null +++ b/gdb/testsuite/gdb.base/kill-detach-inferiors-cmd.exp @@ -0,0 +1,62 @@ +# 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 test_spawn_id [spawn_wait_for_attach $binfile] +set test_pid [spawn_id_get_pid $test_spawn_id] +gdb_test "add-inferior" "Added inferior 3" "add inferior 3" +gdb_test "inferior 3" "Switching to inferior 3.*" +gdb_test "attach $test_pid" "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 $test_pid.*" + +# 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.*" + +kill_wait_spawned_process $test_spawn_id -- 2.30.2