From 3a87ae656c283e4f46ddf7d92c06ecb8992c2bf6 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Tue, 31 Oct 2017 21:30:24 -0400 Subject: [PATCH] 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. --- gdb/ChangeLog | 6 ++++++ gdb/cli/cli-script.c | 22 ++++++++++++++++++---- gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.mi/mi-break.exp | 4 ++-- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index eec03e443cd..a1621e3f0aa 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2017-10-31 Simon Marchi + + * cli/cli-script.c (execute_control_command): Rename to ... + (execute_control_command_1): ... this. + (execute_control_command): New function. + 2017-10-31 Simon Marchi * tracepoint.c (tfind_command): Remove const_cast. diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c index 0a93e8b54f4..bbdfa4068db 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. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 9d0f8139ad2..8c2fd90ea48 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-10-31 Simon Marchi + + * gdb.mi/mi-break.exp (test_breakpoint_commands): Test backtrace + as a breakpoint command. + 2017-10-28 Maksim Dzabraev PR python/21213 diff --git a/gdb/testsuite/gdb.mi/mi-break.exp b/gdb/testsuite/gdb.mi/mi-break.exp index 38670c293ba..41a48a1400d 100644 --- a/gdb/testsuite/gdb.mi/mi-break.exp +++ b/gdb/testsuite/gdb.mi/mi-break.exp @@ -277,7 +277,7 @@ proc test_breakpoint_commands {} { -number 9 -disp keep -func callee2 -file ".*basics.c" \ -line $line_callee2_body - mi_gdb_test "-break-commands 9 \"set \$i=0\" \"while \$i<10\" \"print \$i\" \"set \$i=\$i+1\" \"end\" \"continue\" " \ + mi_gdb_test "-break-commands 9 \"bt\" \"set \$i=0\" \"while \$i<10\" \"print \$i\" \"set \$i=\$i+1\" \"end\" \"continue\" " \ "\\^done" \ "breakpoint commands: set commands" @@ -291,7 +291,7 @@ proc test_breakpoint_commands {} { set test "intermediate stop and continue, bp commands" gdb_expect { -i $gdb_main_spawn_id - -re ".*\\\$1 = 0.*\\\$10 = 9" { + -re ".*callee2.*callee1.*main.*\\\$1 = 0.*\\\$10 = 9" { pass $test } timeout { -- 2.30.2