diff options
author | Simon Marchi <simon.marchi@polymtl.ca> | 2017-10-31 21:30:24 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2017-10-31 21:34:24 -0400 |
commit | 3a87ae656c283e4f46ddf7d92c06ecb8992c2bf6 (patch) | |
tree | 1ab653b3f661835fb7e1be97739d58fb038ba44e /gdb/cli | |
parent | 4d01dee4804d39c1671bc220caf32a327e7e4b10 (diff) | |
download | gdb-3a87ae656c283e4f46ddf7d92c06ecb8992c2bf6.zip gdb-3a87ae656c283e4f46ddf7d92c06ecb8992c2bf6.tar.gz gdb-3a87ae656c283e4f46ddf7d92c06ecb8992c2bf6.tar.bz2 |
Use console uiout when executing breakpoint commands
As reported here
https://sourceware.org/ml/gdb/2017-10/msg00020.html
the output of certain commands, like backtrace, doesn't appear anywhere
when it is run as a breakpoint command and when using MI.
The reason is that the current_uiout is set to the mi_ui_out while these
commands run, whereas we want the output as CLI output. Some commands
like "print" work, because they use printf_filtered (gdb_stdout, ...)
directly, bypassing the current ui_out.
The fix I did is to force setting the cli_uiout as the current_uiout
when calling execute_control_command. I am not sure if this is the
right way to fix the problem, comments about the approach would be
appreciated.
I enhanced gdb.mi/mi-break.exp to test the backtrace command.
Regtested on the buildbot.
gdb/ChangeLog:
* cli/cli-script.c (execute_control_command): Rename to ...
(execute_control_command_1): ... this.
(execute_control_command): New function.
gdb/testsuite/ChangeLog:
* gdb.mi/mi-break.exp (test_breakpoint_commands): Test backtrace
as a breakpoint command.
Diffstat (limited to 'gdb/cli')
-rw-r--r-- | gdb/cli/cli-script.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c index 0a93e8b..bbdfa40 100644 --- a/gdb/cli/cli-script.c +++ b/gdb/cli/cli-script.c @@ -463,8 +463,10 @@ print_command_trace (const char *cmd) printf_filtered ("%s\n", cmd); } -enum command_control_type -execute_control_command (struct command_line *cmd) +/* Helper for execute_control_command. */ + +static enum command_control_type +execute_control_command_1 (struct command_line *cmd) { struct command_line *current; struct value *val; @@ -541,7 +543,7 @@ execute_control_command (struct command_line *cmd) { scoped_restore save_nesting = make_scoped_restore (&command_nest_depth, command_nest_depth + 1); - ret = execute_control_command (current); + ret = execute_control_command_1 (current); /* If we got an error, or a "break" command, then stop looping. */ @@ -600,7 +602,7 @@ execute_control_command (struct command_line *cmd) { scoped_restore save_nesting = make_scoped_restore (&command_nest_depth, command_nest_depth + 1); - ret = execute_control_command (current); + ret = execute_control_command_1 (current); /* If we got an error, get out. */ if (ret != simple_control) @@ -644,6 +646,18 @@ execute_control_command (struct command_line *cmd) return ret; } +enum command_control_type +execute_control_command (struct command_line *cmd) +{ + /* Make sure we use the console uiout. It's possible that we are executing + breakpoint commands while running the MI interpreter. */ + interp *console = interp_lookup (current_ui, INTERP_CONSOLE); + scoped_restore save_uiout + = make_scoped_restore (¤t_uiout, interp_ui_out (console)); + + return execute_control_command_1 (cmd); +} + /* Like execute_control_command, but first set suppress_next_print_command_trace. */ |