* inferior.c (detach_inferior_command): Use get_number_or_range.
(kill_inferior_command): Ditto.
(remove_inferior_command): Ditto.
(initialize_inferiors): Make command names plural.
Update help strings.
2011-02-25 Michael Snyder <msnyder@vmware.com>
* gdb.texinfo (Inferiors and Programs): Update commands to show
that they can accept multiple arguments.
2011-02-25 Michael Snyder <msnyder@vmware.com>
* gdb.multi/base.exp: Add test for remove-inferiors.
* python/py-value.c: Ditto.
* tui/tui-win.c: Ditto.
+2011-02-25 Michael Snyder <msnyder@vmware.com>
+
+ * inferior.c (detach_inferior_command): Use get_number_or_range.
+ (kill_inferior_command): Ditto.
+ (remove_inferior_command): Ditto.
+ (initialize_inferiors): Make command names plural.
+ Update help strings.
+
2011-02-25 Michael Snyder <msnyder@vmware.com>
* inferior.c (print_inferior): Accept a string instead of an int
+2011-02-25 Michael Snyder <msnyder@vmware.com>
+
+ * gdb.texinfo (Inferiors and Programs): Update commands to show
+ that they can accept multiple arguments.
+
2011-02-24 Joel Brobecker <brobecker@adacore.com>
Revert the following patch (code patch was not approved):
systems @value{GDBN} can add inferiors to the debug session
automatically by following calls to @code{fork} and @code{exec}. To
remove inferiors from the debugging session use the
-@w{@code{remove-inferior}} command.
+@w{@code{remove-inferiors}} command.
@table @code
@kindex add-inferior
You can now simply switch focus to inferior 2 and run it.
-@kindex remove-inferior
-@item remove-inferior @var{infno}
-Removes the inferior @var{infno}. It is not possible to remove an
-inferior that is running with this command. For those, use the
-@code{kill} or @code{detach} command first.
+@kindex remove-inferiors
+@item remove-inferiors @var{infno}@dots{}
+Removes the inferior or inferiors @var{infno}@dots{}. It is not
+possible to remove an inferior that is running with this command. For
+those, use the @code{kill} or @code{detach} command first.
@end table
To quit debugging one of the running inferiors that is not the current
inferior, you can either detach from it by using the @w{@code{detach
inferior}} command (allowing it to run independently), or kill it
-using the @w{@code{kill inferior}} command:
+using the @w{@code{kill inferiors}} command:
@table @code
-@kindex detach inferior @var{infno}
-@item detach inferior @var{infno}
-Detach from the inferior identified by @value{GDBN} inferior number
-@var{infno}. Note that the inferior's entry still stays on the list
-of inferiors shown by @code{info inferiors}, but its Description will
-show @samp{<null>}.
+@kindex detach inferiors @var{infno}@dots{}
+@item detach inferior @var{infno}@dots{}
+Detach from the inferior or inferiors identified by @value{GDBN}
+inferior number(s) @var{infno}@dots. Note that the inferior's entry
+still stays on the list of inferiors shown by @code{info inferiors},
+but its Description will show @samp{<null>}.
-@kindex kill inferior @var{infno}
-@item kill inferior @var{infno}
-Kill the inferior identified by @value{GDBN} inferior number
-@var{infno}. Note that the inferior's entry still stays on the list
-of inferiors shown by @code{info inferiors}, but its Description will
-show @samp{<null>}.
+@kindex kill inferiors @var{infno}@dots{}
+@item kill inferiors @var{infno}@dots{}
+Kill the inferior or inferiors identified by @value{GDBN} inferior
+number(s) @var{infno}@dots{}. Note that the inferior's entry still
+stays on the list of inferiors shown by @code{info inferiors}, but its
+Description will show @samp{<null>}.
@end table
After the successful completion of a command such as @code{detach},
-@code{detach inferior}, @code{kill} or @code{kill inferior}, or after
+@code{detach inferiors}, @code{kill} or @code{kill inferiors}, or after
a normal process exit, the inferior is still valid and listed with
@code{info inferiors}, ready to be restarted.
Programs, ,Debugging Multiple Inferiors and Programs}).
To quit debugging one of the forked processes, you can either detach
-from it by using the @w{@code{detach inferior}} command (allowing it
-to run independently), or kill it using the @w{@code{kill inferior}}
+from it by using the @w{@code{detach inferiors}} command (allowing it
+to run independently), or kill it using the @w{@code{kill inferiors}}
command. @xref{Inferiors and Programs, ,Debugging Multiple Inferiors
and Programs}.
struct thread_info *tp;
if (!args || !*args)
- error (_("Requires argument (inferior id to detach)"));
+ error (_("Requires argument (inferior id(s) to detach)"));
- num = parse_and_eval_long (args);
+ while (*args != '\0')
+ {
+ num = get_number_or_range (&args);
- if (!valid_gdb_inferior_id (num))
- error (_("Inferior ID %d not known."), num);
+ if (!valid_gdb_inferior_id (num))
+ {
+ warning (_("Inferior ID %d not known."), num);
+ continue;
+ }
- pid = gdb_inferior_id_to_pid (num);
+ pid = gdb_inferior_id_to_pid (num);
- tp = any_thread_of_process (pid);
- if (!tp)
- error (_("Inferior has no threads."));
+ tp = any_thread_of_process (pid);
+ if (!tp)
+ {
+ warning (_("Inferior ID %d has no threads."), num);
+ continue;
+ }
- switch_to_thread (tp->ptid);
+ switch_to_thread (tp->ptid);
- detach_command (NULL, from_tty);
+ detach_command (NULL, from_tty);
+ }
}
static void
struct thread_info *tp;
if (!args || !*args)
- error (_("Requires argument (inferior id to kill)"));
+ error (_("Requires argument (inferior id(s) to kill)"));
- num = parse_and_eval_long (args);
+ while (*args != '\0')
+ {
+ num = get_number_or_range (&args);
- if (!valid_gdb_inferior_id (num))
- error (_("Inferior ID %d not known."), num);
+ if (!valid_gdb_inferior_id (num))
+ {
+ warning (_("Inferior ID %d not known."), num);
+ continue;
+ }
- pid = gdb_inferior_id_to_pid (num);
+ pid = gdb_inferior_id_to_pid (num);
- tp = any_thread_of_process (pid);
- if (!tp)
- error (_("Inferior has no threads."));
+ tp = any_thread_of_process (pid);
+ if (!tp)
+ {
+ warning (_("Inferior ID %d has no threads."), num);
+ continue;
+ }
- switch_to_thread (tp->ptid);
+ switch_to_thread (tp->ptid);
- target_kill ();
+ target_kill ();
+ }
bfd_cache_close_all ();
}
int num;
struct inferior *inf;
- num = parse_and_eval_long (args);
- inf = find_inferior_id (num);
+ if (args == NULL || *args == '\0')
+ error (_("Requires an argument (inferior id(s) to remove)"));
- if (inf == NULL)
- error (_("Inferior ID %d not known."), num);
+ while (*args != '\0')
+ {
+ num = get_number_or_range (&args);
+ inf = find_inferior_id (num);
- if (inf == current_inferior ())
- error (_("Can not remove current symbol inferior."));
+ if (inf == NULL)
+ {
+ warning (_("Inferior ID %d not known."), num);
+ continue;
+ }
+
+ if (inf == current_inferior ())
+ {
+ warning (_("Can not remove current symbol inferior %d."), num);
+ continue;
+ }
- if (inf->pid != 0)
- error (_("Can not remove an active inferior."));
+ if (inf->pid != 0)
+ {
+ warning (_("Can not remove active inferior %d."), num);
+ continue;
+ }
- delete_inferior_1 (inf, 1);
+ delete_inferior_1 (inf, 1);
+ }
}
struct inferior *
add_com ("add-inferior", no_class, add_inferior_command, _("\
Add a new inferior.\n\
Usage: add-inferior [-copies <N>] [-exec <FILENAME>]\n\
-N is the optional number of inferior to add, default is 1.\n\
+N is the optional number of inferiors to add, default is 1.\n\
FILENAME is the file name of the executable to use\n\
as main program."));
- add_com ("remove-inferior", no_class, remove_inferior_command, _("\
-Remove inferior ID.\n\
-Usage: remove-inferior ID"));
+ add_com ("remove-inferiors", no_class, remove_inferior_command, _("\
+Remove inferior ID (or list of IDs).\n\
+Usage: remove-inferiors ID..."));
add_com ("clone-inferior", no_class, clone_inferior_command, _("\
Clone inferior ID.\n\
adds 1 copy. If ID is not specified, it is the current inferior\n\
that is cloned."));
- add_cmd ("inferior", class_run, detach_inferior_command, _("\
-Detach from inferior ID."),
+ add_cmd ("inferiors", class_run, detach_inferior_command, _("\
+Detach from inferior ID (or list of IDS)."),
&detachlist);
- add_cmd ("inferior", class_run, kill_inferior_command, _("\
-Kill inferior ID."),
+ add_cmd ("inferiors", class_run, kill_inferior_command, _("\
+Kill inferior ID (or list of IDs)."),
&killlist);
add_cmd ("inferior", class_run, inferior_command, _("\
* gdb.python/py-frame.exp: Simplify the initialization phase
using prepare_for_testing.
+2011-02-25 Michael Snyder <msnyder@vmware.com>
+
+ * gdb.multi/base.exp: Add test for remove-inferiors.
+
2011-02-25 Michael Snyder <msnyder@vmware.com>
* gdb.multi/base.exp: Add tests for info inferiors with args.
gdb_test "break hello" ".*"
gdb_test "continue" "Breakpoint \[0-9\].*, hello.*"
+
+# Now let's remove the other two
+
+gdb_test_no_output "remove-inferiors 2-3" "remove-inferiors 2-3"
+
+set see1 0
+set see2 0
+set see3 0
+
+gdb_test_multiple "info inferiors" "check remove-inferiors" {
+ -re ". 3 \[^\r\n\]*${exec3}" {
+ set see3 1
+ exp_continue
+ }
+ -re ". 2 \[^\r\n\]*${exec2}" {
+ set see2 1
+ exp_continue
+ }
+ -re ". 1 \[^\r\n\]*${exec1}" {
+ set see1 1
+ exp_continue
+ }
+ -re "$gdb_prompt $" {
+ if { $see1 && !$see2 && !$see3 } then {
+ pass "check remove-inferiors"
+ } else {
+ fail "check remove-inferiors"
+ }
+ }
+}
+