Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
- 2008, 2009 Free Software Foundation, Inc.
+ 2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of GDB.
char *lim_at_start;
#endif
-/* Signal to catch ^Z typed while reading a command: SIGTSTP or SIGCONT. */
-
-#ifndef STOP_SIGNAL
-#ifdef SIGTSTP
-#define STOP_SIGNAL SIGTSTP
-static void stop_sig (int);
-#endif
-#endif
-
/* Hooks for alternate command interfaces. */
/* Called after most modules have been initialized, but before taking users
that several registers have changed (see value_assign). */
void (*deprecated_register_changed_hook) (int regno);
-/* Tell the GUI someone changed LEN bytes of memory at ADDR */
-void (*deprecated_memory_changed_hook) (CORE_ADDR addr, int len);
-
/* Called when going to wait for the target. Usually allows the GUI to run
while waiting for target events. */
}
#endif
-/* Execute the line P as a command.
- Pass FROM_TTY as second argument to the defining function. */
+void
+prepare_execute_command (void)
+{
+ free_all_values ();
-/* Execute command P, in the current user context. */
+ /* With multiple threads running while the one we're examining is stopped,
+ the dcache can get stale without us being able to detect it.
+ For the duration of the command, though, use the dcache to help
+ things like backtrace. */
+ if (non_stop)
+ target_dcache_invalidate ();
+}
+
+/* Execute the line P as a command, in the current user context.
+ Pass FROM_TTY as second argument to the defining function. */
void
execute_command (char *p, int from_tty)
#endif
}
}
-
- free_all_values ();
+
+ prepare_execute_command ();
/* Force cleanup of any alloca areas if using C alloca instead of
a builtin alloca. */
}
- /* Tell the user if the language has changed (except first time). */
+ /* Tell the user if the language has changed (except first time).
+ First make sure that a new frame has been selected, in case this
+ command or the hooks changed the program state. */
+ deprecated_safe_get_selected_frame ();
if (current_language != expected_language)
{
- if (language_mode == language_mode_auto)
+ if (language_mode == language_mode_auto && info_verbose)
{
language_info (1); /* Print what changed. */
}
}
\f
-#ifdef STOP_SIGNAL
-static void
-stop_sig (int signo)
-{
-#if STOP_SIGNAL == SIGTSTP
- signal (SIGTSTP, SIG_DFL);
-#if HAVE_SIGPROCMASK
- {
- sigset_t zero;
-
- sigemptyset (&zero);
- sigprocmask (SIG_SETMASK, &zero, 0);
- }
-#elif HAVE_SIGSETMASK
- sigsetmask (0);
-#endif
- kill (getpid (), SIGTSTP);
- signal (SIGTSTP, stop_sig);
-#else
- signal (STOP_SIGNAL, stop_sig);
-#endif
- printf_unfiltered ("%s", get_prompt ());
- gdb_flush (gdb_stdout);
-
- /* Forget about any previous command -- null line now will do nothing. */
- dont_repeat ();
-}
-#endif /* STOP_SIGNAL */
-
-/* Initialize signal handlers. */
-static void
-float_handler (int signo)
-{
- /* This message is based on ANSI C, section 4.7. Note that integer
- divide by zero causes this, so "float" is a misnomer. */
- signal (SIGFPE, float_handler);
- error (_("Erroneous arithmetic operation."));
-}
-
-static void
-do_nothing (int signo)
-{
- /* Under System V the default disposition of a signal is reinstated after
- the signal is caught and delivered to an application process. On such
- systems one must restore the replacement signal handler if one wishes
- to continue handling the signal in one's program. On BSD systems this
- is not needed but it is harmless, and it simplifies the code to just do
- it unconditionally. */
- signal (signo, do_nothing);
-}
-
/* The current saved history number from operate-and-get-next.
This is -1 if not valid. */
static int operate_saved_history = -1;
/* Second line is a copyright notice. */
- fprintf_filtered (stream, "Copyright (C) 2009 Free Software Foundation, Inc.\n");
+ fprintf_filtered (stream, "Copyright (C) 2010 Free Software Foundation, Inc.\n");
/* Following the copyright is a brief statement that the program is
free software, that users are free to copy and change it on
}
\f
-/* If necessary, make the user confirm that we should quit. Return
- non-zero if we should quit, zero if we shouldn't. */
+struct qt_args
+{
+ char *args;
+ int from_tty;
+};
-int
-quit_confirm (void)
+/* Callback for iterate_over_inferiors. Kills or detaches the given
+ inferior, depending on how we originally gained control of it. */
+
+static int
+kill_or_detach (struct inferior *inf, void *args)
{
- if (! ptid_equal (inferior_ptid, null_ptid) && target_has_execution)
+ struct qt_args *qt = args;
+ struct thread_info *thread;
+
+ if (inf->pid == 0)
+ return 0;
+
+ thread = any_thread_of_process (inf->pid);
+ if (thread != NULL)
{
- char *s;
- struct inferior *inf = current_inferior ();
-
- /* This is something of a hack. But there's no reliable way to
- see if a GUI is running. The `use_windows' variable doesn't
- cut it. */
- if (deprecated_init_ui_hook)
- s = _("A debugging session is active.\nDo you still want to close the debugger?");
- else if (inf->attach_flag)
- s = _("The program is running. Quit anyway (and detach it)? ");
- else
- s = _("The program is running. Quit anyway (and kill it)? ");
+ switch_to_thread (thread->ptid);
- if (!query ("%s", s))
- return 0;
+ /* Leave core files alone. */
+ if (target_has_execution)
+ {
+ if (inf->attach_flag)
+ target_detach (qt->args, qt->from_tty);
+ else
+ target_kill ();
+ }
}
- return 1;
+ return 0;
}
-struct qt_args
-{
- char *args;
- int from_tty;
-};
-
-/* Callback for iterate_over_threads. Finds any thread of inferior
- given by ARG (really an int*). */
+/* Callback for iterate_over_inferiors. Prints info about what GDB
+ will do to each inferior on a "quit". ARG points to a struct
+ ui_out where output is to be collected. */
static int
-any_thread_of (struct thread_info *thread, void *arg)
+print_inferior_quit_action (struct inferior *inf, void *arg)
{
- int pid = * (int *)arg;
+ struct ui_file *stb = arg;
- if (PIDGET (thread->ptid) == pid)
- return 1;
+ if (inf->pid == 0)
+ return 0;
+
+ if (inf->attach_flag)
+ fprintf_filtered (stb,
+ _("\tInferior %d [%s] will be detached.\n"), inf->num,
+ target_pid_to_str (pid_to_ptid (inf->pid)));
+ else
+ fprintf_filtered (stb,
+ _("\tInferior %d [%s] will be killed.\n"), inf->num,
+ target_pid_to_str (pid_to_ptid (inf->pid)));
return 0;
}
-/* Callback for iterate_over_inferiors. Kills or detaches the given
- inferior, depending on how we originally gained control of it. */
+/* If necessary, make the user confirm that we should quit. Return
+ non-zero if we should quit, zero if we shouldn't. */
-static int
-kill_or_detach (struct inferior *inf, void *args)
+int
+quit_confirm (void)
{
- struct qt_args *qt = args;
- struct thread_info *thread;
+ struct ui_file *stb;
+ struct cleanup *old_chain;
+ char *str;
+ int qr;
+
+ /* Don't even ask if we're only debugging a core file inferior. */
+ if (!have_live_inferiors ())
+ return 1;
+
+ /* Build the query string as a single string. */
+ stb = mem_fileopen ();
+ old_chain = make_cleanup_ui_file_delete (stb);
- thread = iterate_over_threads (any_thread_of, &inf->pid);
- if (thread)
+ /* This is something of a hack. But there's no reliable way to see
+ if a GUI is running. The `use_windows' variable doesn't cut
+ it. */
+ if (deprecated_init_ui_hook)
+ fprintf_filtered (stb, _("A debugging session is active.\n"
+ "Do you still want to close the debugger?"));
+ else
{
- switch_to_thread (thread->ptid);
- if (inf->attach_flag)
- target_detach (qt->args, qt->from_tty);
- else
- target_kill ();
+ fprintf_filtered (stb, _("A debugging session is active.\n\n"));
+ iterate_over_inferiors (print_inferior_quit_action, stb);
+ fprintf_filtered (stb, _("\nQuit anyway? "));
}
- return 0;
+ str = ui_file_xstrdup (stb, NULL);
+ make_cleanup (xfree, str);
+
+ qr = query ("%s", str);
+ do_cleanups (old_chain);
+ return qr;
}
/* Helper routine for quit_force that requires error handling. */
struct qt_args *qt = (struct qt_args *)arg;
/* Kill or detach all inferiors. */
- if (target_has_execution)
- iterate_over_inferiors (kill_or_detach, qt);
+ iterate_over_inferiors (kill_or_detach, qt);
/* Give all pushed targets a chance to do minimal cleanup, and pop
them all out. */
exit (exit_code);
}
+/* If OFF, the debugger will run in non-interactive mode, which means
+ that it will automatically select the default answer to all the
+ queries made to the user. If ON, gdb will wait for the user to
+ answer all queries. If AUTO, gdb will determine whether to run
+ in interactive mode or not depending on whether stdin is a terminal
+ or not. */
+static enum auto_boolean interactive_mode = AUTO_BOOLEAN_AUTO;
+
+/* Implement the "show interactive-mode" option. */
+
+static void
+show_interactive_mode (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c,
+ const char *value)
+{
+ if (interactive_mode == AUTO_BOOLEAN_AUTO)
+ fprintf_filtered (file, "\
+Debugger's interactive mode is %s (currently %s).\n",
+ value, input_from_terminal_p () ? "on" : "off");
+ else
+ fprintf_filtered (file, "Debugger's interactive mode is %s.\n", value);
+}
+
/* Returns whether GDB is running on a terminal and input is
currently coming from that terminal. */
int
input_from_terminal_p (void)
{
+ if (interactive_mode != AUTO_BOOLEAN_AUTO)
+ return interactive_mode == AUTO_BOOLEAN_TRUE;
+
if (gdb_has_a_terminal () && instream == stdin)
return 1;
show_exec_done_display_p,
&setlist, &showlist);
+ add_setshow_auto_boolean_cmd ("interactive-mode", class_support,
+ &interactive_mode, _("\
+Set whether GDB should run in interactive mode or not"), _("\
+Show whether GDB runs in interactive mode"), _("\
+If on, run in interactive mode and wait for the user to answer\n\
+all queries. If off, run in non-interactive mode and automatically\n\
+assume the default answer to all queries. If auto (the default),\n\
+determine which mode to use based on the standard input settings"),
+ NULL,
+ show_interactive_mode,
+ &setlist, &showlist);
+
add_setshow_filename_cmd ("data-directory", class_maintenance,
&gdb_datadir, _("Set GDB's data directory."),
_("Show GDB's data directory."),
initialize_targets (); /* Setup target_terminal macros for utils.c */
initialize_utils (); /* Make errors and warnings possible */
initialize_all_files ();
+ /* This creates the current_program_space. Do this after all the
+ _initialize_foo routines have had a chance to install their
+ per-sspace data keys. Also do this before
+ initialize_current_architecture is called, because it accesses
+ exec_bfd of the current program space. */
+ initialize_progspace ();
+ initialize_inferiors ();
initialize_current_architecture ();
init_cli_cmds();
init_main (); /* But that omits this file! Do it now */