1 /* Multi-process control for GDB, the GNU debugger. 2 3 Copyright (C) 2008-2019 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 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. 11 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. 16 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/>. */ 19 20 #include "defs.h" 21 #include "exec.h" 22 #include "inferior.h" 23 #include "target.h" 24 #include "command.h" 25 #include "completer.h" 26 #include "gdbcmd.h" 27 #include "gdbthread.h" 28 #include "ui-out.h" 29 #include "observable.h" 30 #include "gdbcore.h" 31 #include "symfile.h" 32 #include "common/environ.h" 33 #include "cli/cli-utils.h" 34 #include "continuations.h" 35 #include "arch-utils.h" 36 #include "target-descriptions.h" 37 #include "readline/tilde.h" 38 #include "progspace-and-thread.h" 39 40 /* Keep a registry of per-inferior data-pointers required by other GDB 41 modules. */ 42 43 DEFINE_REGISTRY (inferior, REGISTRY_ACCESS_FIELD) 44 45 struct inferior *inferior_list = NULL; 46 static int highest_inferior_num; 47 48 /* See inferior.h. */ 49 int print_inferior_events = 1; 50 51 /* The Current Inferior. This is a strong reference. I.e., whenever 52 an inferior is the current inferior, its refcount is 53 incremented. */ 54 static struct inferior *current_inferior_ = NULL; 55 56 struct inferior* 57 current_inferior (void) 58 { 59 return current_inferior_; 60 } 61 62 void 63 set_current_inferior (struct inferior *inf) 64 { 65 /* There's always an inferior. */ 66 gdb_assert (inf != NULL); 67 68 inf->incref (); 69 current_inferior_->decref (); 70 current_inferior_ = inf; 71 } 72 73 private_inferior::~private_inferior () = default; 74 75 inferior::~inferior () 76 { 77 inferior *inf = this; 78 79 discard_all_inferior_continuations (inf); 80 inferior_free_data (inf); 81 xfree (inf->args); 82 xfree (inf->terminal); 83 target_desc_info_free (inf->tdesc_info); 84 } 85 86 inferior::inferior (int pid_) 87 : num (++highest_inferior_num), 88 pid (pid_), 89 environment (gdb_environ::from_host_environ ()), 90 registry_data () 91 { 92 inferior_alloc_data (this); 93 } 94 95 struct inferior * 96 add_inferior_silent (int pid) 97 { 98 inferior *inf = new inferior (pid); 99 100 if (inferior_list == NULL) 101 inferior_list = inf; 102 else 103 { 104 inferior *last; 105 106 for (last = inferior_list; last->next != NULL; last = last->next) 107 ; 108 last->next = inf; 109 } 110 111 gdb::observers::inferior_added.notify (inf); 112 113 if (pid != 0) 114 inferior_appeared (inf, pid); 115 116 return inf; 117 } 118 119 struct inferior * 120 add_inferior (int pid) 121 { 122 struct inferior *inf = add_inferior_silent (pid); 123 124 if (print_inferior_events) 125 { 126 if (pid != 0) 127 printf_unfiltered (_("[New inferior %d (%s)]\n"), 128 inf->num, 129 target_pid_to_str (ptid_t (pid))); 130 else 131 printf_unfiltered (_("[New inferior %d]\n"), inf->num); 132 } 133 134 return inf; 135 } 136 137 void 138 delete_inferior (struct inferior *todel) 139 { 140 struct inferior *inf, *infprev; 141 142 infprev = NULL; 143 144 for (inf = inferior_list; inf; infprev = inf, inf = inf->next) 145 if (inf == todel) 146 break; 147 148 if (!inf) 149 return; 150 151 for (thread_info *tp : inf->threads_safe ()) 152 delete_thread_silent (tp); 153 154 if (infprev) 155 infprev->next = inf->next; 156 else 157 inferior_list = inf->next; 158 159 gdb::observers::inferior_removed.notify (inf); 160 161 /* If this program space is rendered useless, remove it. */ 162 if (program_space_empty_p (inf->pspace)) 163 delete_program_space (inf->pspace); 164 165 delete inf; 166 } 167 168 /* If SILENT then be quiet -- don't announce a inferior exit, or the 169 exit of its threads. */ 170 171 static void 172 exit_inferior_1 (struct inferior *inftoex, int silent) 173 { 174 struct inferior *inf; 175 176 for (inf = inferior_list; inf; inf = inf->next) 177 if (inf == inftoex) 178 break; 179 180 if (!inf) 181 return; 182 183 for (thread_info *tp : inf->threads_safe ()) 184 { 185 if (silent) 186 delete_thread_silent (tp); 187 else 188 delete_thread (tp); 189 } 190 191 gdb::observers::inferior_exit.notify (inf); 192 193 inf->pid = 0; 194 inf->fake_pid_p = 0; 195 inf->priv = NULL; 196 197 if (inf->vfork_parent != NULL) 198 { 199 inf->vfork_parent->vfork_child = NULL; 200 inf->vfork_parent = NULL; 201 } 202 if (inf->vfork_child != NULL) 203 { 204 inf->vfork_child->vfork_parent = NULL; 205 inf->vfork_child = NULL; 206 } 207 208 inf->pending_detach = 0; 209 /* Reset it. */ 210 inf->control = inferior_control_state (NO_STOP_QUIETLY); 211 } 212 213 void 214 exit_inferior (inferior *inf) 215 { 216 exit_inferior_1 (inf, 0); 217 } 218 219 void 220 exit_inferior_silent (int pid) 221 { 222 struct inferior *inf = find_inferior_pid (pid); 223 224 exit_inferior_1 (inf, 1); 225 } 226 227 void 228 exit_inferior_silent (inferior *inf) 229 { 230 exit_inferior_1 (inf, 1); 231 } 232 233 /* See inferior.h. */ 234 235 void 236 detach_inferior (inferior *inf) 237 { 238 /* Save the pid, since exit_inferior_1 will reset it. */ 239 int pid = inf->pid; 240 241 exit_inferior_1 (inf, 0); 242 243 if (print_inferior_events) 244 printf_unfiltered (_("[Inferior %d (%s) detached]\n"), 245 inf->num, 246 target_pid_to_str (ptid_t (pid))); 247 } 248 249 void 250 inferior_appeared (struct inferior *inf, int pid) 251 { 252 /* If this is the first inferior with threads, reset the global 253 thread id. */ 254 if (!any_thread_p ()) 255 init_thread_list (); 256 257 inf->pid = pid; 258 inf->has_exit_code = 0; 259 inf->exit_code = 0; 260 261 gdb::observers::inferior_appeared.notify (inf); 262 } 263 264 void 265 discard_all_inferiors (void) 266 { 267 for (inferior *inf : all_non_exited_inferiors ()) 268 exit_inferior_silent (inf); 269 } 270 271 struct inferior * 272 find_inferior_id (int num) 273 { 274 for (inferior *inf : all_inferiors ()) 275 if (inf->num == num) 276 return inf; 277 278 return NULL; 279 } 280 281 struct inferior * 282 find_inferior_pid (int pid) 283 { 284 /* Looking for inferior pid == 0 is always wrong, and indicative of 285 a bug somewhere else. There may be more than one with pid == 0, 286 for instance. */ 287 gdb_assert (pid != 0); 288 289 for (inferior *inf : all_inferiors ()) 290 if (inf->pid == pid) 291 return inf; 292 293 return NULL; 294 } 295 296 /* See inferior.h */ 297 298 struct inferior * 299 find_inferior_ptid (ptid_t ptid) 300 { 301 return find_inferior_pid (ptid.pid ()); 302 } 303 304 /* See inferior.h. */ 305 306 struct inferior * 307 find_inferior_for_program_space (struct program_space *pspace) 308 { 309 struct inferior *cur_inf = current_inferior (); 310 311 if (cur_inf->pspace == pspace) 312 return cur_inf; 313 314 for (inferior *inf : all_inferiors ()) 315 if (inf->pspace == pspace) 316 return inf; 317 318 return NULL; 319 } 320 321 struct inferior * 322 iterate_over_inferiors (int (*callback) (struct inferior *, void *), 323 void *data) 324 { 325 for (inferior *inf : all_inferiors_safe ()) 326 if ((*callback) (inf, data)) 327 return inf; 328 329 return NULL; 330 } 331 332 int 333 have_inferiors (void) 334 { 335 for (inferior *inf ATTRIBUTE_UNUSED : all_non_exited_inferiors ()) 336 return 1; 337 338 return 0; 339 } 340 341 /* Return the number of live inferiors. We account for the case 342 where an inferior might have a non-zero pid but no threads, as 343 in the middle of a 'mourn' operation. */ 344 345 int 346 number_of_live_inferiors (void) 347 { 348 int num_inf = 0; 349 350 for (inferior *inf : all_non_exited_inferiors ()) 351 if (target_has_execution_1 (ptid_t (inf->pid))) 352 for (thread_info *tp ATTRIBUTE_UNUSED : inf->non_exited_threads ()) 353 { 354 /* Found a live thread in this inferior, go to the next 355 inferior. */ 356 ++num_inf; 357 break; 358 } 359 360 return num_inf; 361 } 362 363 /* Return true if there is at least one live inferior. */ 364 365 int 366 have_live_inferiors (void) 367 { 368 return number_of_live_inferiors () > 0; 369 } 370 371 /* Prune away any unused inferiors, and then prune away no longer used 372 program spaces. */ 373 374 void 375 prune_inferiors (void) 376 { 377 struct inferior *ss, **ss_link; 378 379 ss = inferior_list; 380 ss_link = &inferior_list; 381 while (ss) 382 { 383 if (!ss->deletable () 384 || !ss->removable 385 || ss->pid != 0) 386 { 387 ss_link = &ss->next; 388 ss = *ss_link; 389 continue; 390 } 391 392 *ss_link = ss->next; 393 delete_inferior (ss); 394 ss = *ss_link; 395 } 396 } 397 398 /* Simply returns the count of inferiors. */ 399 400 int 401 number_of_inferiors (void) 402 { 403 auto rng = all_inferiors (); 404 return std::distance (rng.begin (), rng.end ()); 405 } 406 407 /* Converts an inferior process id to a string. Like 408 target_pid_to_str, but special cases the null process. */ 409 410 static const char * 411 inferior_pid_to_str (int pid) 412 { 413 if (pid != 0) 414 return target_pid_to_str (ptid_t (pid)); 415 else 416 return _("<null>"); 417 } 418 419 /* See inferior.h. */ 420 421 void 422 print_selected_inferior (struct ui_out *uiout) 423 { 424 struct inferior *inf = current_inferior (); 425 const char *filename = inf->pspace->pspace_exec_filename; 426 427 if (filename == NULL) 428 filename = _("<noexec>"); 429 430 uiout->message (_("[Switching to inferior %d [%s] (%s)]\n"), 431 inf->num, inferior_pid_to_str (inf->pid), filename); 432 } 433 434 /* Prints the list of inferiors and their details on UIOUT. This is a 435 version of 'info_inferior_command' suitable for use from MI. 436 437 If REQUESTED_INFERIORS is not NULL, it's a list of GDB ids of the 438 inferiors that should be printed. Otherwise, all inferiors are 439 printed. */ 440 441 static void 442 print_inferior (struct ui_out *uiout, const char *requested_inferiors) 443 { 444 int inf_count = 0; 445 446 /* Compute number of inferiors we will print. */ 447 for (inferior *inf : all_inferiors ()) 448 { 449 if (!number_is_in_list (requested_inferiors, inf->num)) 450 continue; 451 452 ++inf_count; 453 } 454 455 if (inf_count == 0) 456 { 457 uiout->message ("No inferiors.\n"); 458 return; 459 } 460 461 ui_out_emit_table table_emitter (uiout, 4, inf_count, "inferiors"); 462 uiout->table_header (1, ui_left, "current", ""); 463 uiout->table_header (4, ui_left, "number", "Num"); 464 uiout->table_header (17, ui_left, "target-id", "Description"); 465 uiout->table_header (17, ui_left, "exec", "Executable"); 466 467 uiout->table_body (); 468 for (inferior *inf : all_inferiors ()) 469 { 470 if (!number_is_in_list (requested_inferiors, inf->num)) 471 continue; 472 473 ui_out_emit_tuple tuple_emitter (uiout, NULL); 474 475 if (inf == current_inferior ()) 476 uiout->field_string ("current", "*"); 477 else 478 uiout->field_skip ("current"); 479 480 uiout->field_int ("number", inf->num); 481 482 uiout->field_string ("target-id", inferior_pid_to_str (inf->pid)); 483 484 if (inf->pspace->pspace_exec_filename != NULL) 485 uiout->field_string ("exec", inf->pspace->pspace_exec_filename); 486 else 487 uiout->field_skip ("exec"); 488 489 /* Print extra info that isn't really fit to always present in 490 tabular form. Currently we print the vfork parent/child 491 relationships, if any. */ 492 if (inf->vfork_parent) 493 { 494 uiout->text (_("\n\tis vfork child of inferior ")); 495 uiout->field_int ("vfork-parent", inf->vfork_parent->num); 496 } 497 if (inf->vfork_child) 498 { 499 uiout->text (_("\n\tis vfork parent of inferior ")); 500 uiout->field_int ("vfork-child", inf->vfork_child->num); 501 } 502 503 uiout->text ("\n"); 504 } 505 } 506 507 static void 508 detach_inferior_command (const char *args, int from_tty) 509 { 510 if (!args || !*args) 511 error (_("Requires argument (inferior id(s) to detach)")); 512 513 number_or_range_parser parser (args); 514 while (!parser.finished ()) 515 { 516 int num = parser.get_number (); 517 518 inferior *inf = find_inferior_id (num); 519 if (inf == NULL) 520 { 521 warning (_("Inferior ID %d not known."), num); 522 continue; 523 } 524 525 if (inf->pid == 0) 526 { 527 warning (_("Inferior ID %d is not running."), num); 528 continue; 529 } 530 531 thread_info *tp = any_thread_of_inferior (inf); 532 if (tp == NULL) 533 { 534 warning (_("Inferior ID %d has no threads."), num); 535 continue; 536 } 537 538 switch_to_thread (tp); 539 540 detach_command (NULL, from_tty); 541 } 542 } 543 544 static void 545 kill_inferior_command (const char *args, int from_tty) 546 { 547 if (!args || !*args) 548 error (_("Requires argument (inferior id(s) to kill)")); 549 550 number_or_range_parser parser (args); 551 while (!parser.finished ()) 552 { 553 int num = parser.get_number (); 554 555 inferior *inf = find_inferior_id (num); 556 if (inf == NULL) 557 { 558 warning (_("Inferior ID %d not known."), num); 559 continue; 560 } 561 562 if (inf->pid == 0) 563 { 564 warning (_("Inferior ID %d is not running."), num); 565 continue; 566 } 567 568 thread_info *tp = any_thread_of_inferior (inf); 569 if (tp == NULL) 570 { 571 warning (_("Inferior ID %d has no threads."), num); 572 continue; 573 } 574 575 switch_to_thread (tp); 576 577 target_kill (); 578 } 579 580 bfd_cache_close_all (); 581 } 582 583 static void 584 inferior_command (const char *args, int from_tty) 585 { 586 struct inferior *inf; 587 int num; 588 589 num = parse_and_eval_long (args); 590 591 inf = find_inferior_id (num); 592 if (inf == NULL) 593 error (_("Inferior ID %d not known."), num); 594 595 if (inf->pid != 0) 596 { 597 if (inf != current_inferior ()) 598 { 599 thread_info *tp = any_thread_of_inferior (inf); 600 if (tp == NULL) 601 error (_("Inferior has no threads.")); 602 603 switch_to_thread (tp); 604 } 605 606 gdb::observers::user_selected_context_changed.notify 607 (USER_SELECTED_INFERIOR 608 | USER_SELECTED_THREAD 609 | USER_SELECTED_FRAME); 610 } 611 else 612 { 613 set_current_inferior (inf); 614 switch_to_no_thread (); 615 set_current_program_space (inf->pspace); 616 617 gdb::observers::user_selected_context_changed.notify 618 (USER_SELECTED_INFERIOR); 619 } 620 } 621 622 /* Print information about currently known inferiors. */ 623 624 static void 625 info_inferiors_command (const char *args, int from_tty) 626 { 627 print_inferior (current_uiout, args); 628 } 629 630 /* remove-inferior ID */ 631 632 static void 633 remove_inferior_command (const char *args, int from_tty) 634 { 635 if (args == NULL || *args == '\0') 636 error (_("Requires an argument (inferior id(s) to remove)")); 637 638 number_or_range_parser parser (args); 639 while (!parser.finished ()) 640 { 641 int num = parser.get_number (); 642 struct inferior *inf = find_inferior_id (num); 643 644 if (inf == NULL) 645 { 646 warning (_("Inferior ID %d not known."), num); 647 continue; 648 } 649 650 if (!inf->deletable ()) 651 { 652 warning (_("Can not remove current inferior %d."), num); 653 continue; 654 } 655 656 if (inf->pid != 0) 657 { 658 warning (_("Can not remove active inferior %d."), num); 659 continue; 660 } 661 662 delete_inferior (inf); 663 } 664 } 665 666 struct inferior * 667 add_inferior_with_spaces (void) 668 { 669 struct address_space *aspace; 670 struct program_space *pspace; 671 struct inferior *inf; 672 struct gdbarch_info info; 673 674 /* If all inferiors share an address space on this system, this 675 doesn't really return a new address space; otherwise, it 676 really does. */ 677 aspace = maybe_new_address_space (); 678 pspace = new program_space (aspace); 679 inf = add_inferior (0); 680 inf->pspace = pspace; 681 inf->aspace = pspace->aspace; 682 683 /* Setup the inferior's initial arch, based on information obtained 684 from the global "set ..." options. */ 685 gdbarch_info_init (&info); 686 inf->gdbarch = gdbarch_find_by_info (info); 687 /* The "set ..." options reject invalid settings, so we should 688 always have a valid arch by now. */ 689 gdb_assert (inf->gdbarch != NULL); 690 691 return inf; 692 } 693 694 /* add-inferior [-copies N] [-exec FILENAME] */ 695 696 static void 697 add_inferior_command (const char *args, int from_tty) 698 { 699 int i, copies = 1; 700 gdb::unique_xmalloc_ptr<char> exec; 701 symfile_add_flags add_flags = 0; 702 703 if (from_tty) 704 add_flags |= SYMFILE_VERBOSE; 705 706 if (args) 707 { 708 gdb_argv built_argv (args); 709 710 for (char **argv = built_argv.get (); *argv != NULL; argv++) 711 { 712 if (**argv == '-') 713 { 714 if (strcmp (*argv, "-copies") == 0) 715 { 716 ++argv; 717 if (!*argv) 718 error (_("No argument to -copies")); 719 copies = parse_and_eval_long (*argv); 720 } 721 else if (strcmp (*argv, "-exec") == 0) 722 { 723 ++argv; 724 if (!*argv) 725 error (_("No argument to -exec")); 726 exec.reset (tilde_expand (*argv)); 727 } 728 } 729 else 730 error (_("Invalid argument")); 731 } 732 } 733 734 scoped_restore_current_pspace_and_thread restore_pspace_thread; 735 736 for (i = 0; i < copies; ++i) 737 { 738 struct inferior *inf = add_inferior_with_spaces (); 739 740 printf_filtered (_("Added inferior %d\n"), inf->num); 741 742 if (exec != NULL) 743 { 744 /* Switch over temporarily, while reading executable and 745 symbols.q. */ 746 set_current_program_space (inf->pspace); 747 set_current_inferior (inf); 748 switch_to_no_thread (); 749 750 exec_file_attach (exec.get (), from_tty); 751 symbol_file_add_main (exec.get (), add_flags); 752 } 753 } 754 } 755 756 /* clone-inferior [-copies N] [ID] */ 757 758 static void 759 clone_inferior_command (const char *args, int from_tty) 760 { 761 int i, copies = 1; 762 struct inferior *orginf = NULL; 763 764 if (args) 765 { 766 gdb_argv built_argv (args); 767 768 char **argv = built_argv.get (); 769 for (; *argv != NULL; argv++) 770 { 771 if (**argv == '-') 772 { 773 if (strcmp (*argv, "-copies") == 0) 774 { 775 ++argv; 776 if (!*argv) 777 error (_("No argument to -copies")); 778 copies = parse_and_eval_long (*argv); 779 780 if (copies < 0) 781 error (_("Invalid copies number")); 782 } 783 } 784 else 785 { 786 if (orginf == NULL) 787 { 788 int num; 789 790 /* The first non-option (-) argument specified the 791 program space ID. */ 792 num = parse_and_eval_long (*argv); 793 orginf = find_inferior_id (num); 794 795 if (orginf == NULL) 796 error (_("Inferior ID %d not known."), num); 797 continue; 798 } 799 else 800 error (_("Invalid argument")); 801 } 802 } 803 } 804 805 /* If no inferior id was specified, then the user wants to clone the 806 current inferior. */ 807 if (orginf == NULL) 808 orginf = current_inferior (); 809 810 scoped_restore_current_pspace_and_thread restore_pspace_thread; 811 812 for (i = 0; i < copies; ++i) 813 { 814 struct address_space *aspace; 815 struct program_space *pspace; 816 struct inferior *inf; 817 818 /* If all inferiors share an address space on this system, this 819 doesn't really return a new address space; otherwise, it 820 really does. */ 821 aspace = maybe_new_address_space (); 822 pspace = new program_space (aspace); 823 inf = add_inferior (0); 824 inf->pspace = pspace; 825 inf->aspace = pspace->aspace; 826 inf->gdbarch = orginf->gdbarch; 827 828 /* If the original inferior had a user specified target 829 description, make the clone use it too. */ 830 if (target_desc_info_from_user_p (inf->tdesc_info)) 831 copy_inferior_target_desc_info (inf, orginf); 832 833 printf_filtered (_("Added inferior %d.\n"), inf->num); 834 835 set_current_inferior (inf); 836 switch_to_no_thread (); 837 clone_program_space (pspace, orginf->pspace); 838 } 839 } 840 841 /* Print notices when new inferiors are created and die. */ 842 static void 843 show_print_inferior_events (struct ui_file *file, int from_tty, 844 struct cmd_list_element *c, const char *value) 845 { 846 fprintf_filtered (file, _("Printing of inferior events is %s.\n"), value); 847 } 848 849 /* Return a new value for the selected inferior's id. */ 850 851 static struct value * 852 inferior_id_make_value (struct gdbarch *gdbarch, struct internalvar *var, 853 void *ignore) 854 { 855 struct inferior *inf = current_inferior (); 856 857 return value_from_longest (builtin_type (gdbarch)->builtin_int, inf->num); 858 } 859 860 /* Implementation of `$_inferior' variable. */ 861 862 static const struct internalvar_funcs inferior_funcs = 863 { 864 inferior_id_make_value, 865 NULL, 866 NULL 867 }; 868 869 870 871 void 872 initialize_inferiors (void) 873 { 874 struct cmd_list_element *c = NULL; 875 876 /* There's always one inferior. Note that this function isn't an 877 automatic _initialize_foo function, since other _initialize_foo 878 routines may need to install their per-inferior data keys. We 879 can only allocate an inferior when all those modules have done 880 that. Do this after initialize_progspace, due to the 881 current_program_space reference. */ 882 current_inferior_ = add_inferior_silent (0); 883 current_inferior_->incref (); 884 current_inferior_->pspace = current_program_space; 885 current_inferior_->aspace = current_program_space->aspace; 886 /* The architecture will be initialized shortly, by 887 initialize_current_architecture. */ 888 889 add_info ("inferiors", info_inferiors_command, 890 _("Print a list of inferiors being managed.\n\ 891 Usage: info inferiors [ID]...\n\ 892 If IDs are specified, the list is limited to just those inferiors.\n\ 893 By default all inferiors are displayed.")); 894 895 c = add_com ("add-inferior", no_class, add_inferior_command, _("\ 896 Add a new inferior.\n\ 897 Usage: add-inferior [-copies N] [-exec FILENAME]\n\ 898 N is the optional number of inferiors to add, default is 1.\n\ 899 FILENAME is the file name of the executable to use\n\ 900 as main program.")); 901 set_cmd_completer (c, filename_completer); 902 903 add_com ("remove-inferiors", no_class, remove_inferior_command, _("\ 904 Remove inferior ID (or list of IDs).\n\ 905 Usage: remove-inferiors ID...")); 906 907 add_com ("clone-inferior", no_class, clone_inferior_command, _("\ 908 Clone inferior ID.\n\ 909 Usage: clone-inferior [-copies N] [ID]\n\ 910 Add N copies of inferior ID. The new inferior has the same\n\ 911 executable loaded as the copied inferior. If -copies is not specified,\n\ 912 adds 1 copy. If ID is not specified, it is the current inferior\n\ 913 that is cloned.")); 914 915 add_cmd ("inferiors", class_run, detach_inferior_command, _("\ 916 Detach from inferior ID (or list of IDS).\n\ 917 Usage; detach inferiors ID..."), 918 &detachlist); 919 920 add_cmd ("inferiors", class_run, kill_inferior_command, _("\ 921 Kill inferior ID (or list of IDs).\n\ 922 Usage: kill inferiors ID..."), 923 &killlist); 924 925 add_cmd ("inferior", class_run, inferior_command, _("\ 926 Use this command to switch between inferiors.\n\ 927 Usage: inferior ID\n\ 928 The new inferior ID must be currently known."), 929 &cmdlist); 930 931 add_setshow_boolean_cmd ("inferior-events", no_class, 932 &print_inferior_events, _("\ 933 Set printing of inferior events (e.g., inferior start and exit)."), _("\ 934 Show printing of inferior events (e.g., inferior start and exit)."), NULL, 935 NULL, 936 show_print_inferior_events, 937 &setprintlist, &showprintlist); 938 939 create_internalvar_type_lazy ("_inferior", &inferior_funcs, NULL); 940 } 941