]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/inferior.c
fbe27c8b8731660cc2751cbc10126e84fdb4e473
[thirdparty/binutils-gdb.git] / gdb / inferior.c
1 /* Multi-process control for GDB, the GNU debugger.
2
3 Copyright (C) 2008-2023 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 "gdbsupport/environ.h"
33 #include "cli/cli-utils.h"
34 #include "arch-utils.h"
35 #include "target-descriptions.h"
36 #include "target-connection.h"
37 #include "readline/tilde.h"
38 #include "progspace-and-thread.h"
39 #include "gdbsupport/buildargv.h"
40 #include "cli/cli-style.h"
41 #include "interps.h"
42
43 intrusive_list<inferior> inferior_list;
44 static int highest_inferior_num;
45
46 /* See inferior.h. */
47 bool print_inferior_events = true;
48
49 /* The Current Inferior. This is a strong reference. I.e., whenever
50 an inferior is the current inferior, its refcount is
51 incremented. */
52 static inferior_ref current_inferior_;
53
54 struct inferior*
55 current_inferior (void)
56 {
57 return current_inferior_.get ();
58 }
59
60 void
61 set_current_inferior (struct inferior *inf)
62 {
63 /* There's always an inferior. */
64 gdb_assert (inf != NULL);
65
66 current_inferior_ = inferior_ref::new_reference (inf);
67 }
68
69 private_inferior::~private_inferior () = default;
70
71 inferior::~inferior ()
72 {
73 /* Before the inferior is deleted, all target_ops should be popped from
74 the target stack, this leaves just the dummy_target behind. If this
75 is not done, then any target left in the target stack will be left
76 with an artificially high reference count. As the dummy_target is
77 still on the target stack then we are about to loose a reference to
78 that target, leaving its reference count artificially high. However,
79 this is not critical as the dummy_target is a singleton. */
80 gdb_assert (m_target_stack.top ()->stratum () == dummy_stratum);
81
82 m_continuations.clear ();
83 }
84
85 inferior::inferior (int pid_)
86 : num (++highest_inferior_num),
87 pid (pid_),
88 environment (gdb_environ::from_host_environ ())
89 {
90 m_target_stack.push (get_dummy_target ());
91 }
92
93 /* See inferior.h. */
94
95 int
96 inferior::unpush_target (struct target_ops *t)
97 {
98 /* If unpushing the process stratum target from the inferior while threads
99 exist in the inferior, ensure that we don't leave any threads of the
100 inferior in the target's "resumed with pending wait status" list.
101
102 See also the comment in set_thread_exited. */
103 if (t->stratum () == process_stratum)
104 {
105 process_stratum_target *proc_target = as_process_stratum_target (t);
106
107 for (thread_info *thread : this->non_exited_threads ())
108 proc_target->maybe_remove_resumed_with_pending_wait_status (thread);
109 }
110
111 return m_target_stack.unpush (t);
112 }
113
114 /* See inferior.h. */
115
116 void
117 inferior::unpush_target_and_assert (struct target_ops *target)
118 {
119 gdb_assert (current_inferior () == this);
120
121 if (!unpush_target (target))
122 internal_error ("pop_all_targets couldn't find target %s\n",
123 target->shortname ());
124 }
125
126 /* See inferior.h. */
127
128 void
129 inferior::pop_all_targets_above (enum strata stratum)
130 {
131 /* Unpushing a target might cause it to close. Some targets currently
132 rely on the current_inferior being set for their ::close method, so we
133 temporarily switch inferior now. */
134 scoped_restore_current_pspace_and_thread restore_pspace_and_thread;
135 switch_to_inferior_no_thread (this);
136
137 while (top_target ()->stratum () > stratum)
138 unpush_target_and_assert (top_target ());
139 }
140
141 /* See inferior.h. */
142
143 void
144 inferior::pop_all_targets_at_and_above (enum strata stratum)
145 {
146 /* Unpushing a target might cause it to close. Some targets currently
147 rely on the current_inferior being set for their ::close method, so we
148 temporarily switch inferior now. */
149 scoped_restore_current_pspace_and_thread restore_pspace_and_thread;
150 switch_to_inferior_no_thread (this);
151
152 while (top_target ()->stratum () >= stratum)
153 unpush_target_and_assert (top_target ());
154 }
155
156 void
157 inferior::set_tty (std::string terminal_name)
158 {
159 m_terminal = std::move (terminal_name);
160 }
161
162 const std::string &
163 inferior::tty ()
164 {
165 return m_terminal;
166 }
167
168 /* See inferior.h. */
169
170 void
171 inferior::set_args (gdb::array_view<char * const> args)
172 {
173 set_args (construct_inferior_arguments (args));
174 }
175
176 void
177 inferior::set_arch (gdbarch *arch)
178 {
179 gdb_assert (arch != nullptr);
180 gdb_assert (gdbarch_initialized_p (arch));
181 m_gdbarch = arch;
182
183 process_stratum_target *proc_target = this->process_target ();
184 if (proc_target != nullptr)
185 registers_changed_ptid (proc_target, ptid_t (this->pid));
186 }
187
188 void
189 inferior::add_continuation (std::function<void ()> &&cont)
190 {
191 m_continuations.emplace_front (std::move (cont));
192 }
193
194 void
195 inferior::do_all_continuations ()
196 {
197 while (!m_continuations.empty ())
198 {
199 auto iter = m_continuations.begin ();
200 (*iter) ();
201 m_continuations.erase (iter);
202 }
203 }
204
205 /* Notify interpreters and observers that inferior INF was added. */
206
207 static void
208 notify_inferior_added (inferior *inf)
209 {
210 interps_notify_inferior_added (inf);
211 gdb::observers::inferior_added.notify (inf);
212 }
213
214 struct inferior *
215 add_inferior_silent (int pid)
216 {
217 inferior *inf = new inferior (pid);
218
219 inferior_list.push_back (*inf);
220
221 notify_inferior_added (inf);
222
223 if (pid != 0)
224 inferior_appeared (inf, pid);
225
226 return inf;
227 }
228
229 struct inferior *
230 add_inferior (int pid)
231 {
232 struct inferior *inf = add_inferior_silent (pid);
233
234 if (print_inferior_events)
235 {
236 if (pid != 0)
237 gdb_printf (_("[New inferior %d (%s)]\n"),
238 inf->num,
239 target_pid_to_str (ptid_t (pid)).c_str ());
240 else
241 gdb_printf (_("[New inferior %d]\n"), inf->num);
242 }
243
244 return inf;
245 }
246
247 /* See inferior.h. */
248
249 thread_info *
250 inferior::find_thread (ptid_t ptid)
251 {
252 auto it = this->ptid_thread_map.find (ptid);
253 if (it != this->ptid_thread_map.end ())
254 return it->second;
255 else
256 return nullptr;
257 }
258
259 /* See inferior.h. */
260
261 void
262 inferior::clear_thread_list ()
263 {
264 thread_list.clear_and_dispose ([=] (thread_info *thr)
265 {
266 threads_debug_printf ("deleting thread %s",
267 thr->ptid.to_string ().c_str ());
268 set_thread_exited (thr, {}, true /* silent */);
269 if (thr->deletable ())
270 delete thr;
271 });
272 ptid_thread_map.clear ();
273 }
274
275 /* Notify interpreters and observers that inferior INF was removed. */
276
277 static void
278 notify_inferior_removed (inferior *inf)
279 {
280 interps_notify_inferior_removed (inf);
281 gdb::observers::inferior_removed.notify (inf);
282 }
283
284 void
285 delete_inferior (struct inferior *inf)
286 {
287 inf->clear_thread_list ();
288
289 auto it = inferior_list.iterator_to (*inf);
290 inferior_list.erase (it);
291
292 notify_inferior_removed (inf);
293
294 /* Pop all targets now, this ensures that inferior::unpush is called
295 correctly. As pop_all_targets ends up making a temporary switch to
296 inferior INF then we need to make this call before we delete the
297 program space, which we do below. */
298 inf->pop_all_targets ();
299
300 /* If this program space is rendered useless, remove it. */
301 if (inf->pspace->empty ())
302 delete inf->pspace;
303
304 delete inf;
305 }
306
307 /* Notify interpreters and observers that inferior INF disappeared. */
308
309 static void
310 notify_inferior_disappeared (inferior *inf)
311 {
312 interps_notify_inferior_disappeared (inf);
313 gdb::observers::inferior_exit.notify (inf);
314 }
315
316 /* See inferior.h. */
317
318 void
319 exit_inferior (struct inferior *inf)
320 {
321 inf->clear_thread_list ();
322
323 notify_inferior_disappeared (inf);
324
325 inf->pid = 0;
326 inf->fake_pid_p = false;
327 inf->priv = NULL;
328
329 if (inf->vfork_parent != NULL)
330 {
331 inf->vfork_parent->vfork_child = NULL;
332 inf->vfork_parent = NULL;
333 }
334 if (inf->vfork_child != NULL)
335 {
336 inf->vfork_child->vfork_parent = NULL;
337 inf->vfork_child = NULL;
338 }
339
340 inf->pending_detach = false;
341 /* Reset it. */
342 inf->control = inferior_control_state (NO_STOP_QUIETLY);
343
344 /* Clear the register cache and the frame cache. */
345 registers_changed ();
346 reinit_frame_cache ();
347 }
348
349 /* See inferior.h. */
350
351 void
352 detach_inferior (inferior *inf)
353 {
354 /* Save the pid, since exit_inferior will reset it. */
355 int pid = inf->pid;
356
357 exit_inferior (inf);
358
359 if (print_inferior_events)
360 gdb_printf (_("[Inferior %d (%s) detached]\n"),
361 inf->num,
362 target_pid_to_str (ptid_t (pid)).c_str ());
363 }
364
365 /* Notify interpreters and observers that inferior INF appeared. */
366
367 static void
368 notify_inferior_appeared (inferior *inf)
369 {
370 interps_notify_inferior_appeared (inf);
371 gdb::observers::inferior_appeared.notify (inf);
372 }
373
374 void
375 inferior_appeared (struct inferior *inf, int pid)
376 {
377 /* If this is the first inferior with threads, reset the global
378 thread id. */
379 delete_exited_threads ();
380 if (!any_thread_p ())
381 init_thread_list ();
382
383 inf->pid = pid;
384 inf->has_exit_code = false;
385 inf->exit_code = 0;
386
387 notify_inferior_appeared (inf);
388 }
389
390 struct inferior *
391 find_inferior_id (int num)
392 {
393 for (inferior *inf : all_inferiors ())
394 if (inf->num == num)
395 return inf;
396
397 return NULL;
398 }
399
400 struct inferior *
401 find_inferior_pid (process_stratum_target *targ, int pid)
402 {
403 /* Looking for inferior pid == 0 is always wrong, and indicative of
404 a bug somewhere else. There may be more than one with pid == 0,
405 for instance. */
406 gdb_assert (pid != 0);
407
408 for (inferior *inf : all_inferiors (targ))
409 if (inf->pid == pid)
410 return inf;
411
412 return NULL;
413 }
414
415 /* See inferior.h */
416
417 struct inferior *
418 find_inferior_ptid (process_stratum_target *targ, ptid_t ptid)
419 {
420 return find_inferior_pid (targ, ptid.pid ());
421 }
422
423 /* See inferior.h. */
424
425 struct inferior *
426 find_inferior_for_program_space (struct program_space *pspace)
427 {
428 struct inferior *cur_inf = current_inferior ();
429
430 if (cur_inf->pspace == pspace)
431 return cur_inf;
432
433 for (inferior *inf : all_inferiors ())
434 if (inf->pspace == pspace)
435 return inf;
436
437 return NULL;
438 }
439
440 int
441 have_inferiors (void)
442 {
443 for (inferior *inf ATTRIBUTE_UNUSED : all_non_exited_inferiors ())
444 return 1;
445
446 return 0;
447 }
448
449 /* Return the number of live inferiors. We account for the case
450 where an inferior might have a non-zero pid but no threads, as
451 in the middle of a 'mourn' operation. */
452
453 int
454 number_of_live_inferiors (process_stratum_target *proc_target)
455 {
456 int num_inf = 0;
457
458 for (inferior *inf : all_non_exited_inferiors (proc_target))
459 if (inf->has_execution ())
460 for (thread_info *tp ATTRIBUTE_UNUSED : inf->non_exited_threads ())
461 {
462 /* Found a live thread in this inferior, go to the next
463 inferior. */
464 ++num_inf;
465 break;
466 }
467
468 return num_inf;
469 }
470
471 /* Return true if there is at least one live inferior. */
472
473 int
474 have_live_inferiors (void)
475 {
476 return number_of_live_inferiors (NULL) > 0;
477 }
478
479 /* Prune away any unused inferiors, and then prune away no longer used
480 program spaces. */
481
482 void
483 prune_inferiors (void)
484 {
485 for (inferior *inf : all_inferiors_safe ())
486 {
487 if (!inf->deletable ()
488 || !inf->removable
489 || inf->pid != 0)
490 continue;
491
492 delete_inferior (inf);
493 }
494 }
495
496 /* Simply returns the count of inferiors. */
497
498 int
499 number_of_inferiors (void)
500 {
501 auto rng = all_inferiors ();
502 return std::distance (rng.begin (), rng.end ());
503 }
504
505 /* Converts an inferior process id to a string. Like
506 target_pid_to_str, but special cases the null process. */
507
508 static std::string
509 inferior_pid_to_str (int pid)
510 {
511 if (pid != 0)
512 return target_pid_to_str (ptid_t (pid));
513 else
514 return _("<null>");
515 }
516
517 /* See inferior.h. */
518
519 void
520 print_selected_inferior (struct ui_out *uiout)
521 {
522 struct inferior *inf = current_inferior ();
523 const char *filename = inf->pspace->exec_filename.get ();
524
525 if (filename == NULL)
526 filename = _("<noexec>");
527
528 uiout->message (_("[Switching to inferior %d [%s] (%s)]\n"),
529 inf->num, inferior_pid_to_str (inf->pid).c_str (), filename);
530 }
531
532 /* Helper for print_inferior. Returns the 'connection-id' string for
533 PROC_TARGET. */
534
535 static std::string
536 uiout_field_connection (process_stratum_target *proc_target)
537 {
538 if (proc_target == NULL)
539 return {};
540 else
541 {
542 std::string conn_str = make_target_connection_string (proc_target);
543 return string_printf ("%d (%s)", proc_target->connection_number,
544 conn_str.c_str ());
545 }
546 }
547
548 /* Prints the list of inferiors and their details on UIOUT. This is a
549 version of 'info_inferior_command' suitable for use from MI.
550
551 If REQUESTED_INFERIORS is not NULL, it's a list of GDB ids of the
552 inferiors that should be printed. Otherwise, all inferiors are
553 printed. */
554
555 static void
556 print_inferior (struct ui_out *uiout, const char *requested_inferiors)
557 {
558 int inf_count = 0;
559 size_t connection_id_len = 20;
560
561 /* Compute number of inferiors we will print. */
562 for (inferior *inf : all_inferiors ())
563 {
564 if (!number_is_in_list (requested_inferiors, inf->num))
565 continue;
566
567 std::string conn = uiout_field_connection (inf->process_target ());
568 if (connection_id_len < conn.size ())
569 connection_id_len = conn.size ();
570
571 ++inf_count;
572 }
573
574 if (inf_count == 0)
575 {
576 uiout->message ("No inferiors.\n");
577 return;
578 }
579
580 ui_out_emit_table table_emitter (uiout, 5, inf_count, "inferiors");
581 uiout->table_header (1, ui_left, "current", "");
582 uiout->table_header (4, ui_left, "number", "Num");
583 uiout->table_header (17, ui_left, "target-id", "Description");
584 uiout->table_header (connection_id_len, ui_left,
585 "connection-id", "Connection");
586 uiout->table_header (17, ui_left, "exec", "Executable");
587
588 uiout->table_body ();
589
590 /* Restore the current thread after the loop because we switch the
591 inferior in the loop. */
592 scoped_restore_current_pspace_and_thread restore_pspace_thread;
593 inferior *current_inf = current_inferior ();
594 for (inferior *inf : all_inferiors ())
595 {
596 if (!number_is_in_list (requested_inferiors, inf->num))
597 continue;
598
599 ui_out_emit_tuple tuple_emitter (uiout, NULL);
600
601 if (inf == current_inf)
602 uiout->field_string ("current", "*");
603 else
604 uiout->field_skip ("current");
605
606 uiout->field_signed ("number", inf->num);
607
608 /* Because target_pid_to_str uses the current inferior,
609 switch the inferior. */
610 switch_to_inferior_no_thread (inf);
611
612 uiout->field_string ("target-id", inferior_pid_to_str (inf->pid));
613
614 std::string conn = uiout_field_connection (inf->process_target ());
615 uiout->field_string ("connection-id", conn);
616
617 if (inf->pspace->exec_filename != nullptr)
618 uiout->field_string ("exec", inf->pspace->exec_filename.get (),
619 file_name_style.style ());
620 else
621 uiout->field_skip ("exec");
622
623 /* Print extra info that isn't really fit to always present in
624 tabular form. Currently we print the vfork parent/child
625 relationships, if any. */
626 if (inf->vfork_parent)
627 {
628 uiout->text (_("\n\tis vfork child of inferior "));
629 uiout->field_signed ("vfork-parent", inf->vfork_parent->num);
630 }
631 if (inf->vfork_child)
632 {
633 uiout->text (_("\n\tis vfork parent of inferior "));
634 uiout->field_signed ("vfork-child", inf->vfork_child->num);
635 }
636
637 uiout->text ("\n");
638 }
639 }
640
641 static void
642 detach_inferior_command (const char *args, int from_tty)
643 {
644 if (!args || !*args)
645 error (_("Requires argument (inferior id(s) to detach)"));
646
647 scoped_restore_current_thread restore_thread;
648
649 number_or_range_parser parser (args);
650 while (!parser.finished ())
651 {
652 int num = parser.get_number ();
653
654 inferior *inf = find_inferior_id (num);
655 if (inf == NULL)
656 {
657 warning (_("Inferior ID %d not known."), num);
658 continue;
659 }
660
661 if (inf->pid == 0)
662 {
663 warning (_("Inferior ID %d is not running."), num);
664 continue;
665 }
666
667 thread_info *tp = any_thread_of_inferior (inf);
668 if (tp == NULL)
669 {
670 warning (_("Inferior ID %d has no threads."), num);
671 continue;
672 }
673
674 switch_to_thread (tp);
675
676 detach_command (NULL, from_tty);
677 }
678 }
679
680 static void
681 kill_inferior_command (const char *args, int from_tty)
682 {
683 if (!args || !*args)
684 error (_("Requires argument (inferior id(s) to kill)"));
685
686 scoped_restore_current_thread restore_thread;
687
688 number_or_range_parser parser (args);
689 while (!parser.finished ())
690 {
691 int num = parser.get_number ();
692
693 inferior *inf = find_inferior_id (num);
694 if (inf == NULL)
695 {
696 warning (_("Inferior ID %d not known."), num);
697 continue;
698 }
699
700 if (inf->pid == 0)
701 {
702 warning (_("Inferior ID %d is not running."), num);
703 continue;
704 }
705
706 thread_info *tp = any_thread_of_inferior (inf);
707 if (tp == NULL)
708 {
709 warning (_("Inferior ID %d has no threads."), num);
710 continue;
711 }
712
713 switch_to_thread (tp);
714
715 target_kill ();
716 }
717 }
718
719 /* See inferior.h. */
720
721 void
722 switch_to_inferior_no_thread (inferior *inf)
723 {
724 set_current_inferior (inf);
725 switch_to_no_thread ();
726 set_current_program_space (inf->pspace);
727 }
728
729 /* See regcache.h. */
730
731 std::optional<scoped_restore_current_thread>
732 maybe_switch_inferior (inferior *inf)
733 {
734 std::optional<scoped_restore_current_thread> maybe_restore_thread;
735 if (inf != current_inferior ())
736 {
737 maybe_restore_thread.emplace ();
738 switch_to_inferior_no_thread (inf);
739 }
740
741 return maybe_restore_thread;
742 }
743
744 static void
745 inferior_command (const char *args, int from_tty)
746 {
747 struct inferior *inf;
748 int num;
749
750 if (args == nullptr)
751 {
752 inf = current_inferior ();
753 gdb_assert (inf != nullptr);
754 const char *filename = inf->pspace->exec_filename.get ();
755
756 if (filename == nullptr)
757 filename = _("<noexec>");
758
759 gdb_printf (_("[Current inferior is %d [%s] (%s)]\n"),
760 inf->num, inferior_pid_to_str (inf->pid).c_str (),
761 filename);
762 }
763 else
764 {
765 num = parse_and_eval_long (args);
766
767 inf = find_inferior_id (num);
768 if (inf == NULL)
769 error (_("Inferior ID %d not known."), num);
770
771 if (inf->pid != 0)
772 {
773 if (inf != current_inferior ())
774 {
775 thread_info *tp = any_thread_of_inferior (inf);
776 if (tp == NULL)
777 error (_("Inferior has no threads."));
778
779 switch_to_thread (tp);
780 }
781
782 notify_user_selected_context_changed
783 (USER_SELECTED_INFERIOR
784 | USER_SELECTED_THREAD
785 | USER_SELECTED_FRAME);
786 }
787 else
788 {
789 switch_to_inferior_no_thread (inf);
790
791 notify_user_selected_context_changed
792 (USER_SELECTED_INFERIOR);
793 }
794 }
795 }
796
797 /* Print information about currently known inferiors. */
798
799 static void
800 info_inferiors_command (const char *args, int from_tty)
801 {
802 print_inferior (current_uiout, args);
803 }
804
805 /* remove-inferior ID */
806
807 static void
808 remove_inferior_command (const char *args, int from_tty)
809 {
810 if (args == NULL || *args == '\0')
811 error (_("Requires an argument (inferior id(s) to remove)"));
812
813 number_or_range_parser parser (args);
814 while (!parser.finished ())
815 {
816 int num = parser.get_number ();
817 struct inferior *inf = find_inferior_id (num);
818
819 if (inf == NULL)
820 {
821 warning (_("Inferior ID %d not known."), num);
822 continue;
823 }
824
825 if (!inf->deletable ())
826 {
827 warning (_("Can not remove current inferior %d."), num);
828 continue;
829 }
830
831 if (inf->pid != 0)
832 {
833 warning (_("Can not remove active inferior %d."), num);
834 continue;
835 }
836
837 delete_inferior (inf);
838 }
839 }
840
841 struct inferior *
842 add_inferior_with_spaces (void)
843 {
844 struct address_space *aspace;
845 struct program_space *pspace;
846 struct inferior *inf;
847
848 /* If all inferiors share an address space on this system, this
849 doesn't really return a new address space; otherwise, it
850 really does. */
851 aspace = maybe_new_address_space ();
852 pspace = new program_space (aspace);
853 inf = add_inferior (0);
854 inf->pspace = pspace;
855 inf->aspace = pspace->aspace;
856
857 /* Setup the inferior's initial arch, based on information obtained
858 from the global "set ..." options. */
859 gdbarch_info info;
860 inf->set_arch (gdbarch_find_by_info (info));
861 /* The "set ..." options reject invalid settings, so we should
862 always have a valid arch by now. */
863 gdb_assert (inf->arch () != nullptr);
864
865 return inf;
866 }
867
868 /* See inferior.h. */
869
870 void
871 switch_to_inferior_and_push_target (inferior *new_inf,
872 bool no_connection, inferior *org_inf)
873 {
874 process_stratum_target *proc_target = org_inf->process_target ();
875
876 /* Switch over temporarily, while reading executable and
877 symbols. */
878 switch_to_inferior_no_thread (new_inf);
879
880 /* Reuse the target for new inferior. */
881 if (!no_connection && proc_target != NULL)
882 {
883 new_inf->push_target (proc_target);
884 gdb_printf (_("Added inferior %d on connection %d (%s)\n"),
885 new_inf->num,
886 proc_target->connection_number,
887 make_target_connection_string (proc_target).c_str ());
888 }
889 else
890 gdb_printf (_("Added inferior %d\n"), new_inf->num);
891 }
892
893 /* add-inferior [-copies N] [-exec FILENAME] [-no-connection] */
894
895 static void
896 add_inferior_command (const char *args, int from_tty)
897 {
898 int i, copies = 1;
899 gdb::unique_xmalloc_ptr<char> exec;
900 symfile_add_flags add_flags = 0;
901 bool no_connection = false;
902
903 if (from_tty)
904 add_flags |= SYMFILE_VERBOSE;
905
906 if (args)
907 {
908 gdb_argv built_argv (args);
909
910 for (char **argv = built_argv.get (); *argv != NULL; argv++)
911 {
912 if (**argv == '-')
913 {
914 if (strcmp (*argv, "-copies") == 0)
915 {
916 ++argv;
917 if (!*argv)
918 error (_("No argument to -copies"));
919 copies = parse_and_eval_long (*argv);
920 }
921 else if (strcmp (*argv, "-no-connection") == 0)
922 no_connection = true;
923 else if (strcmp (*argv, "-exec") == 0)
924 {
925 ++argv;
926 if (!*argv)
927 error (_("No argument to -exec"));
928 exec.reset (tilde_expand (*argv));
929 }
930 }
931 else
932 error (_("Invalid argument"));
933 }
934 }
935
936 inferior *orginf = current_inferior ();
937
938 scoped_restore_current_pspace_and_thread restore_pspace_thread;
939
940 for (i = 0; i < copies; ++i)
941 {
942 inferior *inf = add_inferior_with_spaces ();
943
944 switch_to_inferior_and_push_target (inf, no_connection, orginf);
945
946 if (exec != NULL)
947 {
948 exec_file_attach (exec.get (), from_tty);
949 symbol_file_add_main (exec.get (), add_flags);
950 }
951 }
952 }
953
954 /* clone-inferior [-copies N] [ID] [-no-connection] */
955
956 static void
957 clone_inferior_command (const char *args, int from_tty)
958 {
959 int i, copies = 1;
960 struct inferior *orginf = NULL;
961 bool no_connection = false;
962
963 if (args)
964 {
965 gdb_argv built_argv (args);
966
967 char **argv = built_argv.get ();
968 for (; *argv != NULL; argv++)
969 {
970 if (**argv == '-')
971 {
972 if (strcmp (*argv, "-copies") == 0)
973 {
974 ++argv;
975 if (!*argv)
976 error (_("No argument to -copies"));
977 copies = parse_and_eval_long (*argv);
978
979 if (copies < 0)
980 error (_("Invalid copies number"));
981 }
982 else if (strcmp (*argv, "-no-connection") == 0)
983 no_connection = true;
984 }
985 else
986 {
987 if (orginf == NULL)
988 {
989 int num;
990
991 /* The first non-option (-) argument specified the
992 program space ID. */
993 num = parse_and_eval_long (*argv);
994 orginf = find_inferior_id (num);
995
996 if (orginf == NULL)
997 error (_("Inferior ID %d not known."), num);
998 continue;
999 }
1000 else
1001 error (_("Invalid argument"));
1002 }
1003 }
1004 }
1005
1006 /* If no inferior id was specified, then the user wants to clone the
1007 current inferior. */
1008 if (orginf == NULL)
1009 orginf = current_inferior ();
1010
1011 scoped_restore_current_pspace_and_thread restore_pspace_thread;
1012
1013 for (i = 0; i < copies; ++i)
1014 {
1015 struct address_space *aspace;
1016 struct program_space *pspace;
1017 struct inferior *inf;
1018
1019 /* If all inferiors share an address space on this system, this
1020 doesn't really return a new address space; otherwise, it
1021 really does. */
1022 aspace = maybe_new_address_space ();
1023 pspace = new program_space (aspace);
1024 inf = add_inferior (0);
1025 inf->pspace = pspace;
1026 inf->aspace = pspace->aspace;
1027 inf->set_arch (orginf->arch ());
1028
1029 switch_to_inferior_and_push_target (inf, no_connection, orginf);
1030
1031 /* If the original inferior had a user specified target
1032 description, make the clone use it too. */
1033 if (inf->tdesc_info.from_user_p ())
1034 inf->tdesc_info = orginf->tdesc_info;
1035
1036 clone_program_space (pspace, orginf->pspace);
1037
1038 /* Copy properties from the original inferior to the new one. */
1039 inf->set_args (orginf->args ());
1040 inf->set_cwd (orginf->cwd ());
1041 inf->set_tty (orginf->tty ());
1042 for (const std::string &set_var : orginf->environment.user_set_env ())
1043 {
1044 /* set_var has the form NAME=value. Split on the first '='. */
1045 const std::string::size_type pos = set_var.find ('=');
1046 gdb_assert (pos != std::string::npos);
1047 const std::string varname = set_var.substr (0, pos);
1048 inf->environment.set
1049 (varname.c_str (), orginf->environment.get (varname.c_str ()));
1050 }
1051 for (const std::string &unset_var
1052 : orginf->environment.user_unset_env ())
1053 inf->environment.unset (unset_var.c_str ());
1054
1055 gdb::observers::inferior_cloned.notify (orginf, inf);
1056 }
1057 }
1058
1059 /* Print notices when new inferiors are created and die. */
1060 static void
1061 show_print_inferior_events (struct ui_file *file, int from_tty,
1062 struct cmd_list_element *c, const char *value)
1063 {
1064 gdb_printf (file, _("Printing of inferior events is %s.\n"), value);
1065 }
1066
1067 /* Return a new value for the selected inferior's id. */
1068
1069 static struct value *
1070 inferior_id_make_value (struct gdbarch *gdbarch, struct internalvar *var,
1071 void *ignore)
1072 {
1073 struct inferior *inf = current_inferior ();
1074
1075 return value_from_longest (builtin_type (gdbarch)->builtin_int, inf->num);
1076 }
1077
1078 /* Implementation of `$_inferior' variable. */
1079
1080 static const struct internalvar_funcs inferior_funcs =
1081 {
1082 inferior_id_make_value,
1083 NULL,
1084 };
1085
1086 \f
1087
1088 void
1089 initialize_inferiors (void)
1090 {
1091 struct cmd_list_element *c = NULL;
1092
1093 /* There's always one inferior. Note that this function isn't an
1094 automatic _initialize_foo function, since other _initialize_foo
1095 routines may need to install their per-inferior data keys. We
1096 can only allocate an inferior when all those modules have done
1097 that. Do this after initialize_progspace, due to the
1098 current_program_space reference. */
1099 set_current_inferior (add_inferior_silent (0));
1100 current_inferior_->pspace = current_program_space;
1101 current_inferior_->aspace = current_program_space->aspace;
1102 /* The architecture will be initialized shortly, by
1103 initialize_current_architecture. */
1104
1105 add_info ("inferiors", info_inferiors_command,
1106 _("Print a list of inferiors being managed.\n\
1107 Usage: info inferiors [ID]...\n\
1108 If IDs are specified, the list is limited to just those inferiors.\n\
1109 By default all inferiors are displayed."));
1110
1111 c = add_com ("add-inferior", no_class, add_inferior_command, _("\
1112 Add a new inferior.\n\
1113 Usage: add-inferior [-copies N] [-exec FILENAME] [-no-connection]\n\
1114 N is the optional number of inferiors to add, default is 1.\n\
1115 FILENAME is the file name of the executable to use\n\
1116 as main program.\n\
1117 By default, the new inferior inherits the current inferior's connection.\n\
1118 If -no-connection is specified, the new inferior begins with\n\
1119 no target connection yet."));
1120 set_cmd_completer (c, filename_completer);
1121
1122 add_com ("remove-inferiors", no_class, remove_inferior_command, _("\
1123 Remove inferior ID (or list of IDs).\n\
1124 Usage: remove-inferiors ID..."));
1125
1126 add_com ("clone-inferior", no_class, clone_inferior_command, _("\
1127 Clone inferior ID.\n\
1128 Usage: clone-inferior [-copies N] [-no-connection] [ID]\n\
1129 Add N copies of inferior ID. The new inferiors have the same\n\
1130 executable loaded as the copied inferior. If -copies is not specified,\n\
1131 adds 1 copy. If ID is not specified, it is the current inferior\n\
1132 that is cloned.\n\
1133 By default, the new inferiors inherit the copied inferior's connection.\n\
1134 If -no-connection is specified, the new inferiors begin with\n\
1135 no target connection yet."));
1136
1137 add_cmd ("inferiors", class_run, detach_inferior_command, _("\
1138 Detach from inferior ID (or list of IDS).\n\
1139 Usage; detach inferiors ID..."),
1140 &detachlist);
1141
1142 add_cmd ("inferiors", class_run, kill_inferior_command, _("\
1143 Kill inferior ID (or list of IDs).\n\
1144 Usage: kill inferiors ID..."),
1145 &killlist);
1146
1147 add_cmd ("inferior", class_run, inferior_command, _("\
1148 Use this command to switch between inferiors.\n\
1149 Usage: inferior ID\n\
1150 The new inferior ID must be currently known."),
1151 &cmdlist);
1152
1153 add_setshow_boolean_cmd ("inferior-events", no_class,
1154 &print_inferior_events, _("\
1155 Set printing of inferior events (such as inferior start and exit)."), _("\
1156 Show printing of inferior events (such as inferior start and exit)."), NULL,
1157 NULL,
1158 show_print_inferior_events,
1159 &setprintlist, &showprintlist);
1160
1161 create_internalvar_type_lazy ("_inferior", &inferior_funcs, NULL);
1162 }