summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/cli/cli-logging.c104
-rw-r--r--gdb/testsuite/gdb.mi/mi-logging.exp14
2 files changed, 28 insertions, 90 deletions
diff --git a/gdb/cli/cli-logging.c b/gdb/cli/cli-logging.c
index f9a845e1b4f..9de55f04a32 100644
--- a/gdb/cli/cli-logging.c
+++ b/gdb/cli/cli-logging.c
@@ -47,7 +47,7 @@ show_logging_filename (struct ui_file *file, int from_tty,
static int logging_overwrite;
static void
-set_logging_overwrite (char *args, int from_tty, struct cmd_list_element *c)
+maybe_warn_already_logging ()
{
if (saved_filename)
warning (_("Currently logging to %s. Turn the logging off and on to "
@@ -55,6 +55,12 @@ set_logging_overwrite (char *args, int from_tty, struct cmd_list_element *c)
}
static void
+set_logging_overwrite (char *args, int from_tty, struct cmd_list_element *c)
+{
+ maybe_warn_already_logging ();
+}
+
+static void
show_logging_overwrite (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
@@ -67,70 +73,10 @@ show_logging_overwrite (struct ui_file *file, int from_tty,
/* Value as configured by the user. */
static int logging_redirect;
-/* The on-disk file in use if logging is currently active together
- with redirection turned off (and therefore using tee_file_new).
- For active logging with redirection the on-disk file is directly in
- GDB_STDOUT and this variable is NULL. */
-static struct ui_file *logging_no_redirect_file;
-
static void
set_logging_redirect (char *args, int from_tty, struct cmd_list_element *c)
{
- ui_file_up destroy_old_stdout;
- struct ui_file *output, *new_logging_no_redirect_file;
- struct ui_out *uiout = current_uiout;
-
- if (saved_filename == NULL
- || (logging_redirect != 0 && logging_no_redirect_file == NULL)
- || (logging_redirect == 0 && logging_no_redirect_file != NULL))
- return;
-
- if (logging_redirect != 0)
- {
- gdb_assert (logging_no_redirect_file != NULL);
-
- /* ui_out_redirect still has not been called for next
- gdb_stdout. */
- destroy_old_stdout.reset (gdb_stdout);
-
- output = logging_no_redirect_file;
- new_logging_no_redirect_file = NULL;
-
- if (from_tty)
- fprintf_unfiltered (saved_output.out, "Redirecting output to %s.\n",
- logging_filename);
- }
- else
- {
- gdb_assert (logging_no_redirect_file == NULL);
- output = new tee_file (saved_output.out, 0, gdb_stdout, 0);
- new_logging_no_redirect_file = gdb_stdout;
-
- if (from_tty)
- fprintf_unfiltered (saved_output.out, "Copying output to %s.\n",
- logging_filename);
- }
-
- /* Give the current interpreter a chance to do anything special that
- it might need for logging, such as updating other channels. */
- if (current_interp_set_logging (1, output, NULL) == 0)
- {
- gdb_stdout = output;
- gdb_stdlog = output;
- gdb_stderr = output;
- gdb_stdtarg = output;
- gdb_stdtargerr = output;
- }
-
- logging_no_redirect_file = new_logging_no_redirect_file;
-
- /* There is a former output pushed on the ui_out_redirect stack. We
- want to replace it by OUTPUT so we must pop the former value
- first. Ideally, we should either do both the pop and push or do
- neither of them. */
-
- uiout->redirect (NULL);
- uiout->redirect (output);
+ maybe_warn_already_logging ();
}
static void
@@ -144,12 +90,6 @@ show_logging_redirect (struct ui_file *file, int from_tty,
static void
pop_output_files (void)
{
- if (logging_no_redirect_file)
- {
- delete logging_no_redirect_file;
- logging_no_redirect_file = NULL;
- }
-
if (current_interp_set_logging (0, NULL, NULL) == 0)
{
/* Only delete one of the files -- they are all set to the same
@@ -203,16 +143,10 @@ handle_redirections (int from_tty)
if (from_tty)
fprintf_unfiltered (gdb_stdout, "Copying output to %s.\n",
logging_filename);
- logging_no_redirect_file = no_redirect_file;
- }
- else
- {
- gdb_assert (logging_no_redirect_file == NULL);
-
- if (from_tty)
- fprintf_unfiltered (gdb_stdout, "Redirecting output to %s.\n",
- logging_filename);
}
+ else if (from_tty)
+ fprintf_unfiltered (gdb_stdout, "Redirecting output to %s.\n",
+ logging_filename);
log.release ();
@@ -290,20 +224,10 @@ show_logging_command (char *args, int from_tty)
else
printf_unfiltered (_("Logs will be appended to the log file.\n"));
- if (saved_filename)
- {
- if (logging_redirect)
- printf_unfiltered (_("Output is being sent only to the log file.\n"));
- else
- printf_unfiltered (_("Output is being logged and displayed.\n"));
- }
+ if (logging_redirect)
+ printf_unfiltered (_("Output will be sent only to the log file.\n"));
else
- {
- if (logging_redirect)
- printf_unfiltered (_("Output will be sent only to the log file.\n"));
- else
- printf_unfiltered (_("Output will be logged and displayed.\n"));
- }
+ printf_unfiltered (_("Output will be logged and displayed.\n"));
}
/* Provide a prototype to silence -Wmissing-prototypes. */
diff --git a/gdb/testsuite/gdb.mi/mi-logging.exp b/gdb/testsuite/gdb.mi/mi-logging.exp
index 788a9bf6647..07eaff90d14 100644
--- a/gdb/testsuite/gdb.mi/mi-logging.exp
+++ b/gdb/testsuite/gdb.mi/mi-logging.exp
@@ -82,6 +82,20 @@ if [regexp "1001\\^done\[\r\n\]+$mi_log_prompt.*1002\\^running\[\r\n\]+\\*runnin
fail "redirect log file contents"
}
+# Now try enabling a redirect while GDB is already logging. This used
+# to crash GDB.
+with_test_prefix "redirect while already logging" {
+ mi_gdb_test "-gdb-set logging redirect off" ".*" \
+ "logging redirect off"
+ mi_gdb_test "-gdb-set logging on" ".*" \
+ "logging on"
+ mi_gdb_test "-gdb-set logging redirect on" \
+ ".*warning: Currently logging .*Turn the logging off and on to make the new setting effective.*" \
+ "logging redirect on"
+ mi_gdb_test "-gdb-set logging off" ".*" \
+ "logging off"
+}
+
mi_gdb_exit
remote_file host delete $milogfile