1 /* Multi-process control for GDB, the GNU debugger.
3 Copyright (C) 2008-2022 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
25 #include "completer.h"
27 #include "gdbthread.h"
29 #include "observable.h"
32 #include "gdbsupport/environ.h"
33 #include "cli/cli-utils.h"
34 #include "arch-utils.h"
35 #include "target-descriptions.h"
36 #include "readline/tilde.h"
37 #include "progspace-and-thread.h"
39 /* Keep a registry of per-inferior data-pointers required by other GDB
42 DEFINE_REGISTRY (inferior
, REGISTRY_ACCESS_FIELD
)
44 intrusive_list
<inferior
> inferior_list
;
45 static int highest_inferior_num
;
48 bool print_inferior_events
= true;
50 /* The Current Inferior. This is a strong reference. I.e., whenever
51 an inferior is the current inferior, its refcount is
53 static inferior_ref current_inferior_
;
56 current_inferior (void)
58 return current_inferior_
.get ();
62 set_current_inferior (struct inferior
*inf
)
64 /* There's always an inferior. */
65 gdb_assert (inf
!= NULL
);
67 current_inferior_
= inferior_ref::new_reference (inf
);
70 private_inferior::~private_inferior () = default;
72 inferior::~inferior ()
76 m_continuations
.clear ();
77 inferior_free_data (inf
);
78 target_desc_info_free (inf
->tdesc_info
);
81 inferior::inferior (int pid_
)
82 : num (++highest_inferior_num
),
84 environment (gdb_environ::from_host_environ ()),
87 inferior_alloc_data (this);
89 m_target_stack
.push (get_dummy_target ());
95 inferior::unpush_target (struct target_ops
*t
)
97 /* If unpushing the process stratum target from the inferior while threads
98 exist in the inferior, ensure that we don't leave any threads of the
99 inferior in the target's "resumed with pending wait status" list.
101 See also the comment in set_thread_exited. */
102 if (t
->stratum () == process_stratum
)
104 process_stratum_target
*proc_target
= as_process_stratum_target (t
);
106 for (thread_info
*thread
: this->non_exited_threads ())
107 proc_target
->maybe_remove_resumed_with_pending_wait_status (thread
);
110 return m_target_stack
.unpush (t
);
114 inferior::set_tty (std::string terminal_name
)
116 m_terminal
= std::move (terminal_name
);
126 inferior::add_continuation (std::function
<void ()> &&cont
)
128 m_continuations
.emplace_front (std::move (cont
));
132 inferior::do_all_continuations ()
134 while (!m_continuations
.empty ())
136 auto iter
= m_continuations
.begin ();
138 m_continuations
.erase (iter
);
143 add_inferior_silent (int pid
)
145 inferior
*inf
= new inferior (pid
);
147 inferior_list
.push_back (*inf
);
149 gdb::observers::inferior_added
.notify (inf
);
152 inferior_appeared (inf
, pid
);
158 add_inferior (int pid
)
160 struct inferior
*inf
= add_inferior_silent (pid
);
162 if (print_inferior_events
)
165 printf_unfiltered (_("[New inferior %d (%s)]\n"),
167 target_pid_to_str (ptid_t (pid
)).c_str ());
169 printf_unfiltered (_("[New inferior %d]\n"), inf
->num
);
175 /* See inferior.h. */
178 inferior::clear_thread_list (bool silent
)
180 thread_list
.clear_and_dispose ([=] (thread_info
*thr
)
182 threads_debug_printf ("deleting thread %s, silent = %d",
183 thr
->ptid
.to_string ().c_str (), silent
);
184 set_thread_exited (thr
, silent
);
185 if (thr
->deletable ())
188 ptid_thread_map
.clear ();
192 delete_inferior (struct inferior
*inf
)
194 inf
->clear_thread_list (true);
196 auto it
= inferior_list
.iterator_to (*inf
);
197 inferior_list
.erase (it
);
199 gdb::observers::inferior_removed
.notify (inf
);
201 /* If this program space is rendered useless, remove it. */
202 if (inf
->pspace
->empty ())
208 /* If SILENT then be quiet -- don't announce a inferior exit, or the
209 exit of its threads. */
212 exit_inferior_1 (struct inferior
*inf
, int silent
)
214 inf
->clear_thread_list (silent
);
216 gdb::observers::inferior_exit
.notify (inf
);
219 inf
->fake_pid_p
= false;
222 if (inf
->vfork_parent
!= NULL
)
224 inf
->vfork_parent
->vfork_child
= NULL
;
225 inf
->vfork_parent
= NULL
;
227 if (inf
->vfork_child
!= NULL
)
229 inf
->vfork_child
->vfork_parent
= NULL
;
230 inf
->vfork_child
= NULL
;
233 inf
->pending_detach
= 0;
235 inf
->control
= inferior_control_state (NO_STOP_QUIETLY
);
237 /* Clear the register cache and the frame cache. */
238 registers_changed ();
239 reinit_frame_cache ();
243 exit_inferior (inferior
*inf
)
245 exit_inferior_1 (inf
, 0);
249 exit_inferior_silent (inferior
*inf
)
251 exit_inferior_1 (inf
, 1);
254 /* See inferior.h. */
257 detach_inferior (inferior
*inf
)
259 /* Save the pid, since exit_inferior_1 will reset it. */
262 exit_inferior_1 (inf
, 0);
264 if (print_inferior_events
)
265 printf_unfiltered (_("[Inferior %d (%s) detached]\n"),
267 target_pid_to_str (ptid_t (pid
)).c_str ());
271 inferior_appeared (struct inferior
*inf
, int pid
)
273 /* If this is the first inferior with threads, reset the global
275 delete_exited_threads ();
276 if (!any_thread_p ())
280 inf
->has_exit_code
= 0;
283 gdb::observers::inferior_appeared
.notify (inf
);
287 find_inferior_id (int num
)
289 for (inferior
*inf
: all_inferiors ())
297 find_inferior_pid (process_stratum_target
*targ
, int pid
)
299 /* Looking for inferior pid == 0 is always wrong, and indicative of
300 a bug somewhere else. There may be more than one with pid == 0,
302 gdb_assert (pid
!= 0);
304 for (inferior
*inf
: all_inferiors (targ
))
314 find_inferior_ptid (process_stratum_target
*targ
, ptid_t ptid
)
316 return find_inferior_pid (targ
, ptid
.pid ());
319 /* See inferior.h. */
322 find_inferior_for_program_space (struct program_space
*pspace
)
324 struct inferior
*cur_inf
= current_inferior ();
326 if (cur_inf
->pspace
== pspace
)
329 for (inferior
*inf
: all_inferiors ())
330 if (inf
->pspace
== pspace
)
337 have_inferiors (void)
339 for (inferior
*inf ATTRIBUTE_UNUSED
: all_non_exited_inferiors ())
345 /* Return the number of live inferiors. We account for the case
346 where an inferior might have a non-zero pid but no threads, as
347 in the middle of a 'mourn' operation. */
350 number_of_live_inferiors (process_stratum_target
*proc_target
)
354 for (inferior
*inf
: all_non_exited_inferiors (proc_target
))
355 if (inf
->has_execution ())
356 for (thread_info
*tp ATTRIBUTE_UNUSED
: inf
->non_exited_threads ())
358 /* Found a live thread in this inferior, go to the next
367 /* Return true if there is at least one live inferior. */
370 have_live_inferiors (void)
372 return number_of_live_inferiors (NULL
) > 0;
375 /* Prune away any unused inferiors, and then prune away no longer used
379 prune_inferiors (void)
381 for (inferior
*inf
: all_inferiors_safe ())
383 if (!inf
->deletable ()
388 delete_inferior (inf
);
392 /* Simply returns the count of inferiors. */
395 number_of_inferiors (void)
397 auto rng
= all_inferiors ();
398 return std::distance (rng
.begin (), rng
.end ());
401 /* Converts an inferior process id to a string. Like
402 target_pid_to_str, but special cases the null process. */
405 inferior_pid_to_str (int pid
)
408 return target_pid_to_str (ptid_t (pid
));
413 /* See inferior.h. */
416 print_selected_inferior (struct ui_out
*uiout
)
418 struct inferior
*inf
= current_inferior ();
419 const char *filename
= inf
->pspace
->exec_filename
.get ();
421 if (filename
== NULL
)
422 filename
= _("<noexec>");
424 uiout
->message (_("[Switching to inferior %d [%s] (%s)]\n"),
425 inf
->num
, inferior_pid_to_str (inf
->pid
).c_str (), filename
);
428 /* Helper for print_inferior. Returns the 'connection-id' string for
432 uiout_field_connection (process_stratum_target
*proc_target
)
434 if (proc_target
== NULL
)
438 else if (proc_target
->connection_string () != NULL
)
440 return string_printf ("%d (%s %s)",
441 proc_target
->connection_number
,
442 proc_target
->shortname (),
443 proc_target
->connection_string ());
447 return string_printf ("%d (%s)",
448 proc_target
->connection_number
,
449 proc_target
->shortname ());
453 /* Prints the list of inferiors and their details on UIOUT. This is a
454 version of 'info_inferior_command' suitable for use from MI.
456 If REQUESTED_INFERIORS is not NULL, it's a list of GDB ids of the
457 inferiors that should be printed. Otherwise, all inferiors are
461 print_inferior (struct ui_out
*uiout
, const char *requested_inferiors
)
464 size_t connection_id_len
= 20;
466 /* Compute number of inferiors we will print. */
467 for (inferior
*inf
: all_inferiors ())
469 if (!number_is_in_list (requested_inferiors
, inf
->num
))
472 std::string conn
= uiout_field_connection (inf
->process_target ());
473 if (connection_id_len
< conn
.size ())
474 connection_id_len
= conn
.size ();
481 uiout
->message ("No inferiors.\n");
485 ui_out_emit_table
table_emitter (uiout
, 5, inf_count
, "inferiors");
486 uiout
->table_header (1, ui_left
, "current", "");
487 uiout
->table_header (4, ui_left
, "number", "Num");
488 uiout
->table_header (17, ui_left
, "target-id", "Description");
489 uiout
->table_header (connection_id_len
, ui_left
,
490 "connection-id", "Connection");
491 uiout
->table_header (17, ui_left
, "exec", "Executable");
493 uiout
->table_body ();
495 /* Restore the current thread after the loop because we switch the
496 inferior in the loop. */
497 scoped_restore_current_pspace_and_thread restore_pspace_thread
;
498 inferior
*current_inf
= current_inferior ();
499 for (inferior
*inf
: all_inferiors ())
501 if (!number_is_in_list (requested_inferiors
, inf
->num
))
504 ui_out_emit_tuple
tuple_emitter (uiout
, NULL
);
506 if (inf
== current_inf
)
507 uiout
->field_string ("current", "*");
509 uiout
->field_skip ("current");
511 uiout
->field_signed ("number", inf
->num
);
513 /* Because target_pid_to_str uses the current inferior,
514 switch the inferior. */
515 switch_to_inferior_no_thread (inf
);
517 uiout
->field_string ("target-id", inferior_pid_to_str (inf
->pid
));
519 std::string conn
= uiout_field_connection (inf
->process_target ());
520 uiout
->field_string ("connection-id", conn
);
522 if (inf
->pspace
->exec_filename
!= nullptr)
523 uiout
->field_string ("exec", inf
->pspace
->exec_filename
.get ());
525 uiout
->field_skip ("exec");
527 /* Print extra info that isn't really fit to always present in
528 tabular form. Currently we print the vfork parent/child
529 relationships, if any. */
530 if (inf
->vfork_parent
)
532 uiout
->text (_("\n\tis vfork child of inferior "));
533 uiout
->field_signed ("vfork-parent", inf
->vfork_parent
->num
);
535 if (inf
->vfork_child
)
537 uiout
->text (_("\n\tis vfork parent of inferior "));
538 uiout
->field_signed ("vfork-child", inf
->vfork_child
->num
);
546 detach_inferior_command (const char *args
, int from_tty
)
549 error (_("Requires argument (inferior id(s) to detach)"));
551 scoped_restore_current_thread restore_thread
;
553 number_or_range_parser
parser (args
);
554 while (!parser
.finished ())
556 int num
= parser
.get_number ();
558 inferior
*inf
= find_inferior_id (num
);
561 warning (_("Inferior ID %d not known."), num
);
567 warning (_("Inferior ID %d is not running."), num
);
571 thread_info
*tp
= any_thread_of_inferior (inf
);
574 warning (_("Inferior ID %d has no threads."), num
);
578 switch_to_thread (tp
);
580 detach_command (NULL
, from_tty
);
585 kill_inferior_command (const char *args
, int from_tty
)
588 error (_("Requires argument (inferior id(s) to kill)"));
590 scoped_restore_current_thread restore_thread
;
592 number_or_range_parser
parser (args
);
593 while (!parser
.finished ())
595 int num
= parser
.get_number ();
597 inferior
*inf
= find_inferior_id (num
);
600 warning (_("Inferior ID %d not known."), num
);
606 warning (_("Inferior ID %d is not running."), num
);
610 thread_info
*tp
= any_thread_of_inferior (inf
);
613 warning (_("Inferior ID %d has no threads."), num
);
617 switch_to_thread (tp
);
622 bfd_cache_close_all ();
625 /* See inferior.h. */
628 switch_to_inferior_no_thread (inferior
*inf
)
630 set_current_inferior (inf
);
631 switch_to_no_thread ();
632 set_current_program_space (inf
->pspace
);
636 inferior_command (const char *args
, int from_tty
)
638 struct inferior
*inf
;
643 inf
= current_inferior ();
644 gdb_assert (inf
!= nullptr);
645 const char *filename
= inf
->pspace
->exec_filename
.get ();
647 if (filename
== nullptr)
648 filename
= _("<noexec>");
650 printf_filtered (_("[Current inferior is %d [%s] (%s)]\n"),
651 inf
->num
, inferior_pid_to_str (inf
->pid
).c_str (),
656 num
= parse_and_eval_long (args
);
658 inf
= find_inferior_id (num
);
660 error (_("Inferior ID %d not known."), num
);
664 if (inf
!= current_inferior ())
666 thread_info
*tp
= any_thread_of_inferior (inf
);
668 error (_("Inferior has no threads."));
670 switch_to_thread (tp
);
673 gdb::observers::user_selected_context_changed
.notify
674 (USER_SELECTED_INFERIOR
675 | USER_SELECTED_THREAD
676 | USER_SELECTED_FRAME
);
680 switch_to_inferior_no_thread (inf
);
682 gdb::observers::user_selected_context_changed
.notify
683 (USER_SELECTED_INFERIOR
);
688 /* Print information about currently known inferiors. */
691 info_inferiors_command (const char *args
, int from_tty
)
693 print_inferior (current_uiout
, args
);
696 /* remove-inferior ID */
699 remove_inferior_command (const char *args
, int from_tty
)
701 if (args
== NULL
|| *args
== '\0')
702 error (_("Requires an argument (inferior id(s) to remove)"));
704 number_or_range_parser
parser (args
);
705 while (!parser
.finished ())
707 int num
= parser
.get_number ();
708 struct inferior
*inf
= find_inferior_id (num
);
712 warning (_("Inferior ID %d not known."), num
);
716 if (!inf
->deletable ())
718 warning (_("Can not remove current inferior %d."), num
);
724 warning (_("Can not remove active inferior %d."), num
);
728 delete_inferior (inf
);
733 add_inferior_with_spaces (void)
735 struct address_space
*aspace
;
736 struct program_space
*pspace
;
737 struct inferior
*inf
;
739 /* If all inferiors share an address space on this system, this
740 doesn't really return a new address space; otherwise, it
742 aspace
= maybe_new_address_space ();
743 pspace
= new program_space (aspace
);
744 inf
= add_inferior (0);
745 inf
->pspace
= pspace
;
746 inf
->aspace
= pspace
->aspace
;
748 /* Setup the inferior's initial arch, based on information obtained
749 from the global "set ..." options. */
751 inf
->gdbarch
= gdbarch_find_by_info (info
);
752 /* The "set ..." options reject invalid settings, so we should
753 always have a valid arch by now. */
754 gdb_assert (inf
->gdbarch
!= NULL
);
759 /* Switch to inferior NEW_INF, a new inferior, and unless
760 NO_CONNECTION is true, push the process_stratum_target of ORG_INF
764 switch_to_inferior_and_push_target (inferior
*new_inf
,
765 bool no_connection
, inferior
*org_inf
)
767 process_stratum_target
*proc_target
= org_inf
->process_target ();
769 /* Switch over temporarily, while reading executable and
771 switch_to_inferior_no_thread (new_inf
);
773 /* Reuse the target for new inferior. */
774 if (!no_connection
&& proc_target
!= NULL
)
776 new_inf
->push_target (proc_target
);
777 if (proc_target
->connection_string () != NULL
)
778 printf_filtered (_("Added inferior %d on connection %d (%s %s)\n"),
780 proc_target
->connection_number
,
781 proc_target
->shortname (),
782 proc_target
->connection_string ());
784 printf_filtered (_("Added inferior %d on connection %d (%s)\n"),
786 proc_target
->connection_number
,
787 proc_target
->shortname ());
790 printf_filtered (_("Added inferior %d\n"), new_inf
->num
);
793 /* add-inferior [-copies N] [-exec FILENAME] [-no-connection] */
796 add_inferior_command (const char *args
, int from_tty
)
799 gdb::unique_xmalloc_ptr
<char> exec
;
800 symfile_add_flags add_flags
= 0;
801 bool no_connection
= false;
804 add_flags
|= SYMFILE_VERBOSE
;
808 gdb_argv
built_argv (args
);
810 for (char **argv
= built_argv
.get (); *argv
!= NULL
; argv
++)
814 if (strcmp (*argv
, "-copies") == 0)
818 error (_("No argument to -copies"));
819 copies
= parse_and_eval_long (*argv
);
821 else if (strcmp (*argv
, "-no-connection") == 0)
822 no_connection
= true;
823 else if (strcmp (*argv
, "-exec") == 0)
827 error (_("No argument to -exec"));
828 exec
.reset (tilde_expand (*argv
));
832 error (_("Invalid argument"));
836 inferior
*orginf
= current_inferior ();
838 scoped_restore_current_pspace_and_thread restore_pspace_thread
;
840 for (i
= 0; i
< copies
; ++i
)
842 inferior
*inf
= add_inferior_with_spaces ();
844 switch_to_inferior_and_push_target (inf
, no_connection
, orginf
);
848 exec_file_attach (exec
.get (), from_tty
);
849 symbol_file_add_main (exec
.get (), add_flags
);
854 /* clone-inferior [-copies N] [ID] [-no-connection] */
857 clone_inferior_command (const char *args
, int from_tty
)
860 struct inferior
*orginf
= NULL
;
861 bool no_connection
= false;
865 gdb_argv
built_argv (args
);
867 char **argv
= built_argv
.get ();
868 for (; *argv
!= NULL
; argv
++)
872 if (strcmp (*argv
, "-copies") == 0)
876 error (_("No argument to -copies"));
877 copies
= parse_and_eval_long (*argv
);
880 error (_("Invalid copies number"));
882 else if (strcmp (*argv
, "-no-connection") == 0)
883 no_connection
= true;
891 /* The first non-option (-) argument specified the
893 num
= parse_and_eval_long (*argv
);
894 orginf
= find_inferior_id (num
);
897 error (_("Inferior ID %d not known."), num
);
901 error (_("Invalid argument"));
906 /* If no inferior id was specified, then the user wants to clone the
909 orginf
= current_inferior ();
911 scoped_restore_current_pspace_and_thread restore_pspace_thread
;
913 for (i
= 0; i
< copies
; ++i
)
915 struct address_space
*aspace
;
916 struct program_space
*pspace
;
917 struct inferior
*inf
;
919 /* If all inferiors share an address space on this system, this
920 doesn't really return a new address space; otherwise, it
922 aspace
= maybe_new_address_space ();
923 pspace
= new program_space (aspace
);
924 inf
= add_inferior (0);
925 inf
->pspace
= pspace
;
926 inf
->aspace
= pspace
->aspace
;
927 inf
->gdbarch
= orginf
->gdbarch
;
929 switch_to_inferior_and_push_target (inf
, no_connection
, orginf
);
931 /* If the original inferior had a user specified target
932 description, make the clone use it too. */
933 if (target_desc_info_from_user_p (inf
->tdesc_info
))
934 copy_inferior_target_desc_info (inf
, orginf
);
936 clone_program_space (pspace
, orginf
->pspace
);
938 /* Copy properties from the original inferior to the new one. */
939 inf
->set_args (orginf
->args ());
940 inf
->set_cwd (orginf
->cwd ());
941 inf
->set_tty (orginf
->tty ());
942 for (const std::string
&set_var
: orginf
->environment
.user_set_env ())
944 /* set_var has the form NAME=value. Split on the first '='. */
945 const std::string::size_type pos
= set_var
.find ('=');
946 gdb_assert (pos
!= std::string::npos
);
947 const std::string varname
= set_var
.substr (0, pos
);
949 (varname
.c_str (), orginf
->environment
.get (varname
.c_str ()));
951 for (const std::string
&unset_var
952 : orginf
->environment
.user_unset_env ())
953 inf
->environment
.unset (unset_var
.c_str ());
957 /* Print notices when new inferiors are created and die. */
959 show_print_inferior_events (struct ui_file
*file
, int from_tty
,
960 struct cmd_list_element
*c
, const char *value
)
962 fprintf_filtered (file
, _("Printing of inferior events is %s.\n"), value
);
965 /* Return a new value for the selected inferior's id. */
967 static struct value
*
968 inferior_id_make_value (struct gdbarch
*gdbarch
, struct internalvar
*var
,
971 struct inferior
*inf
= current_inferior ();
973 return value_from_longest (builtin_type (gdbarch
)->builtin_int
, inf
->num
);
976 /* Implementation of `$_inferior' variable. */
978 static const struct internalvar_funcs inferior_funcs
=
980 inferior_id_make_value
,
988 initialize_inferiors (void)
990 struct cmd_list_element
*c
= NULL
;
992 /* There's always one inferior. Note that this function isn't an
993 automatic _initialize_foo function, since other _initialize_foo
994 routines may need to install their per-inferior data keys. We
995 can only allocate an inferior when all those modules have done
996 that. Do this after initialize_progspace, due to the
997 current_program_space reference. */
998 set_current_inferior (add_inferior_silent (0));
999 current_inferior_
->pspace
= current_program_space
;
1000 current_inferior_
->aspace
= current_program_space
->aspace
;
1001 /* The architecture will be initialized shortly, by
1002 initialize_current_architecture. */
1004 add_info ("inferiors", info_inferiors_command
,
1005 _("Print a list of inferiors being managed.\n\
1006 Usage: info inferiors [ID]...\n\
1007 If IDs are specified, the list is limited to just those inferiors.\n\
1008 By default all inferiors are displayed."));
1010 c
= add_com ("add-inferior", no_class
, add_inferior_command
, _("\
1011 Add a new inferior.\n\
1012 Usage: add-inferior [-copies N] [-exec FILENAME] [-no-connection]\n\
1013 N is the optional number of inferiors to add, default is 1.\n\
1014 FILENAME is the file name of the executable to use\n\
1016 By default, the new inferior inherits the current inferior's connection.\n\
1017 If -no-connection is specified, the new inferior begins with\n\
1018 no target connection yet."));
1019 set_cmd_completer (c
, filename_completer
);
1021 add_com ("remove-inferiors", no_class
, remove_inferior_command
, _("\
1022 Remove inferior ID (or list of IDs).\n\
1023 Usage: remove-inferiors ID..."));
1025 add_com ("clone-inferior", no_class
, clone_inferior_command
, _("\
1026 Clone inferior ID.\n\
1027 Usage: clone-inferior [-copies N] [-no-connection] [ID]\n\
1028 Add N copies of inferior ID. The new inferiors have the same\n\
1029 executable loaded as the copied inferior. If -copies is not specified,\n\
1030 adds 1 copy. If ID is not specified, it is the current inferior\n\
1032 By default, the new inferiors inherit the copied inferior's connection.\n\
1033 If -no-connection is specified, the new inferiors begin with\n\
1034 no target connection yet."));
1036 add_cmd ("inferiors", class_run
, detach_inferior_command
, _("\
1037 Detach from inferior ID (or list of IDS).\n\
1038 Usage; detach inferiors ID..."),
1041 add_cmd ("inferiors", class_run
, kill_inferior_command
, _("\
1042 Kill inferior ID (or list of IDs).\n\
1043 Usage: kill inferiors ID..."),
1046 add_cmd ("inferior", class_run
, inferior_command
, _("\
1047 Use this command to switch between inferiors.\n\
1048 Usage: inferior ID\n\
1049 The new inferior ID must be currently known."),
1052 add_setshow_boolean_cmd ("inferior-events", no_class
,
1053 &print_inferior_events
, _("\
1054 Set printing of inferior events (such as inferior start and exit)."), _("\
1055 Show printing of inferior events (such as inferior start and exit)."), NULL
,
1057 show_print_inferior_events
,
1058 &setprintlist
, &showprintlist
);
1060 create_internalvar_type_lazy ("_inferior", &inferior_funcs
, NULL
);