diff options
Diffstat (limited to 'gdb/cli')
-rw-r--r-- | gdb/cli/cli-interp.c | 31 | ||||
-rw-r--r-- | gdb/cli/cli-interp.h | 3 | ||||
-rw-r--r-- | gdb/cli/cli-logging.c | 27 |
3 files changed, 47 insertions, 14 deletions
diff --git a/gdb/cli/cli-interp.c b/gdb/cli/cli-interp.c index 7876f91..a8cf617 100644 --- a/gdb/cli/cli-interp.c +++ b/gdb/cli/cli-interp.c @@ -395,13 +395,15 @@ struct saved_output_files ui_file *log; ui_file *targ; ui_file *targerr; + ui_file *file_to_delete; }; static saved_output_files saved_output; /* See cli-interp.h. */ void -cli_interp_base::set_logging (ui_file_up logfile, bool logging_redirect) +cli_interp_base::set_logging (ui_file_up logfile, bool logging_redirect, + bool debug_redirect) { if (logfile != nullptr) { @@ -411,28 +413,34 @@ cli_interp_base::set_logging (ui_file_up logfile, bool logging_redirect) saved_output.targ = gdb_stdtarg; saved_output.targerr = gdb_stdtargerr; - /* If logging is being redirected, then grab logfile. */ + /* If something is being redirected, then grab logfile. */ ui_file *logfile_p = nullptr; - if (logging_redirect) - logfile_p = logfile.release (); + if (logging_redirect || debug_redirect) + { + logfile_p = logfile.get (); + saved_output.file_to_delete = logfile_p; + } - /* If logging is not being redirected, then a tee containing both the + /* If something is not being redirected, then a tee containing both the logfile and stdout. */ ui_file *tee = nullptr; - if (!logging_redirect) - tee = new tee_file (gdb_stdout, std::move (logfile)); + if (!logging_redirect || !debug_redirect) + { + tee = new tee_file (gdb_stdout, std::move (logfile)); + saved_output.file_to_delete = tee; + } gdb_stdout = logging_redirect ? logfile_p : tee; - gdb_stdlog = logging_redirect ? logfile_p : tee; + gdb_stdlog = debug_redirect ? logfile_p : tee; gdb_stderr = logging_redirect ? logfile_p : tee; gdb_stdtarg = logging_redirect ? logfile_p : tee; gdb_stdtargerr = logging_redirect ? logfile_p : tee; } else { - /* Only delete one of the files -- they are all set to the same - value. */ - delete gdb_stdout; + /* Delete the correct file. If it's the tee then the logfile will also + be deleted. */ + delete saved_output.file_to_delete; gdb_stdout = saved_output.out; gdb_stderr = saved_output.err; @@ -445,6 +453,7 @@ cli_interp_base::set_logging (ui_file_up logfile, bool logging_redirect) saved_output.log = nullptr; saved_output.targ = nullptr; saved_output.targerr = nullptr; + saved_output.file_to_delete = nullptr; } } diff --git a/gdb/cli/cli-interp.h b/gdb/cli/cli-interp.h index 0c2e73b..334a37a 100644 --- a/gdb/cli/cli-interp.h +++ b/gdb/cli/cli-interp.h @@ -28,7 +28,8 @@ public: explicit cli_interp_base (const char *name); virtual ~cli_interp_base () = 0; - void set_logging (ui_file_up logfile, bool logging_redirect) override; + void set_logging (ui_file_up logfile, bool logging_redirect, + bool debug_redirect) override; void pre_command_loop () override; bool supports_command_editing () override; }; diff --git a/gdb/cli/cli-logging.c b/gdb/cli/cli-logging.c index 670e7e2..bef5f39 100644 --- a/gdb/cli/cli-logging.c +++ b/gdb/cli/cli-logging.c @@ -62,6 +62,7 @@ show_logging_overwrite (struct ui_file *file, int from_tty, /* Value as configured by the user. */ static int logging_redirect; +static int debug_redirect; static void set_logging_redirect (const char *args, @@ -81,7 +82,7 @@ show_logging_redirect (struct ui_file *file, int from_tty, static void pop_output_files (void) { - current_interp_set_logging (NULL, false); + current_interp_set_logging (NULL, false, false); /* Stay consistent with handle_redirections. */ if (!current_uiout->is_mi_like_p ()) @@ -112,12 +113,20 @@ handle_redirections (int from_tty) else fprintf_unfiltered (gdb_stdout, "Redirecting output to %s.\n", logging_filename); + + if (!debug_redirect) + fprintf_unfiltered (gdb_stdout, "Copying debug output to %s.\n", + logging_filename); + else + fprintf_unfiltered (gdb_stdout, "Redirecting debug output to %s.\n", + logging_filename); } saved_filename = xstrdup (logging_filename); /* Let the interpreter do anything it needs. */ - current_interp_set_logging (std::move (log), logging_redirect); + current_interp_set_logging (std::move (log), logging_redirect, + debug_redirect); /* Redirect the current ui-out object's output to the log. Use gdb_stdout, not log, since the interpreter may have created a tee @@ -185,6 +194,11 @@ show_logging_command (const char *args, int from_tty) printf_unfiltered (_("Output will be sent only to the log file.\n")); else printf_unfiltered (_("Output will be logged and displayed.\n")); + + if (debug_redirect) + printf_unfiltered (_("Debug output will be sent only to the log file.\n")); + else + printf_unfiltered (_("Debug output will be logged and displayed.\n")); } void @@ -213,6 +227,15 @@ If redirect is on, output will go only to the log file."), set_logging_redirect, show_logging_redirect, &set_logging_cmdlist, &show_logging_cmdlist); + add_setshow_boolean_cmd ("debugredirect", class_support, + &debug_redirect, _("\ +Set the logging debug output mode."), _("\ +Show the logging debug output mode."), _("\ +If debug redirect is off, debug will go to both the screen and the log file.\n\ +If debug redirect is on, debug will go only to the log file."), + set_logging_redirect, + show_logging_redirect, + &set_logging_cmdlist, &show_logging_cmdlist); add_setshow_filename_cmd ("file", class_support, &logging_filename, _("\ Set the current logfile."), _("\ Show the current logfile."), _("\ |