diff options
Diffstat (limited to 'gdb/inferior.c')
-rw-r--r-- | gdb/inferior.c | 118 |
1 files changed, 116 insertions, 2 deletions
diff --git a/gdb/inferior.c b/gdb/inferior.c index a99a3be..43eacda 100644 --- a/gdb/inferior.c +++ b/gdb/inferior.c @@ -25,6 +25,7 @@ #include "gdbthread.h" #include "ui-out.h" #include "observer.h" +#include "gdbthread.h" void _initialize_inferiors (void); @@ -352,12 +353,112 @@ print_inferior (struct ui_out *uiout, int requested_inferior) do_cleanups (old_chain); } +static void +detach_inferior_command (char *args, int from_tty) +{ + int num, pid; + struct thread_info *tp; + + if (!args || !*args) + error (_("Requires argument (inferior id to detach)")); + + num = parse_and_eval_long (args); + + if (!valid_gdb_inferior_id (num)) + error (_("Inferior ID %d not known."), num); + + pid = gdb_inferior_id_to_pid (num); + + tp = any_thread_of_process (pid); + if (!tp) + error (_("Inferior has no threads.")); + + switch_to_thread (tp->ptid); + + detach_command (NULL, from_tty); +} + +static void +kill_inferior_command (char *args, int from_tty) +{ + int num, pid; + struct thread_info *tp; + + if (!args || !*args) + error (_("Requires argument (inferior id to kill)")); + + num = parse_and_eval_long (args); + + if (!valid_gdb_inferior_id (num)) + error (_("Inferior ID %d not known."), num); + + pid = gdb_inferior_id_to_pid (num); + + tp = any_thread_of_process (pid); + if (!tp) + error (_("Inferior has no threads.")); + + switch_to_thread (tp->ptid); + + target_kill (); + + bfd_cache_close_all (); +} + +static void +inferior_command (char *args, int from_tty) +{ + int num, pid; + + if (!have_inferiors ()) + error (_("No inferiors")); + + num = parse_and_eval_long (args); + + if (!valid_gdb_inferior_id (num)) + error (_("Inferior ID %d not known."), num); + + pid = gdb_inferior_id_to_pid (num); + + if (pid != ptid_get_pid (inferior_ptid)) + { + struct thread_info *tp; + + tp = any_thread_of_process (pid); + if (!tp) + error (_("Inferior has no threads.")); + + switch_to_thread (tp->ptid); + } + + printf_filtered (_("[Switching to thread %d (%s)] "), + pid_to_thread_id (inferior_ptid), + target_pid_to_str (inferior_ptid)); + + if (is_running (inferior_ptid)) + ui_out_text (uiout, "(running)\n"); + else + { + ui_out_text (uiout, "\n"); + print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC); + } +} + /* Print information about currently known inferiors. */ static void -info_inferiors_command (char *arg, int from_tty) +info_inferiors_command (char *args, int from_tty) { - print_inferior (uiout, -1); + int requested = -1; + + if (args && *args) + { + requested = parse_and_eval_long (args); + if (!valid_gdb_inferior_id (requested)) + error (_("Inferior ID %d not known."), requested); + } + + print_inferior (uiout, requested); } /* Print notices when new inferiors are created and die. */ @@ -381,4 +482,17 @@ Show printing of inferior events (e.g., inferior start and exit)."), NULL, NULL, show_print_inferior_events, &setprintlist, &showprintlist); + + add_cmd ("inferior", class_run, detach_inferior_command, _("\ +Detach from inferior ID."), + &detachlist); + + add_cmd ("inferior", class_run, kill_inferior_command, _("\ +Kill inferior ID."), + &killlist); + + add_cmd ("inferior", class_run, inferior_command, _("\ +Use this command to switch between inferiors.\n\ +The new inferior ID must be currently known."), + &cmdlist); } |