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> * 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.
This commit is contained in:
parent
766062f62f
commit
af62414197
|
@ -76,6 +76,14 @@
|
|||
* 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
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
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):
|
||||
|
|
|
@ -2465,7 +2465,7 @@ You can get multiple executables into a debugging session via the
|
|||
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
|
||||
|
@ -2498,37 +2498,37 @@ Added inferior 2.
|
|||
|
||||
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.
|
||||
|
||||
|
@ -2986,8 +2986,8 @@ to another by using the @code{inferior} command (@pxref{Inferiors and
|
|||
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}.
|
||||
|
||||
|
|
107
gdb/inferior.c
107
gdb/inferior.c
|
@ -624,22 +624,31 @@ detach_inferior_command (char *args, int from_tty)
|
|||
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
|
||||
|
@ -649,22 +658,31 @@ kill_inferior_command (char *args, int from_tty)
|
|||
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 ();
|
||||
}
|
||||
|
@ -740,19 +758,34 @@ remove_inferior_command (char *args, int from_tty)
|
|||
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 *
|
||||
|
@ -1048,13 +1081,13 @@ initialize_inferiors (void)
|
|||
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\
|
||||
|
@ -1064,12 +1097,12 @@ executable loaded as the copied inferior. If -copies is not specified,\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, _("\
|
||||
|
|
|
@ -3,6 +3,10 @@
|
|||
* 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.
|
||||
|
|
|
@ -156,3 +156,34 @@ if { ![runto_main] } then {
|
|||
|
||||
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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue