Use console uiout when executing breakpoint commands
authorSimon Marchi <simon.marchi@polymtl.ca>
Wed, 1 Nov 2017 01:30:24 +0000 (21:30 -0400)
committerSimon Marchi <simon.marchi@polymtl.ca>
Wed, 1 Nov 2017 01:34:24 +0000 (21:34 -0400)
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
gdb/cli/cli-script.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.mi/mi-break.exp

index eec03e443cddd728ade4ba7086fcba8028f59486..a1621e3f0aa9ca7dde8f5afaec12efd57852ca84 100644 (file)
@@ -1,3 +1,9 @@
+2017-10-31  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * cli/cli-script.c (execute_control_command): Rename to ...
+       (execute_control_command_1): ... this.
+       (execute_control_command): New function.
+
 2017-10-31  Simon Marchi  <simon.marchi@ericsson.com>
 
        * tracepoint.c (tfind_command): Remove const_cast.
index 0a93e8b54f4763765f553db1f5e958e8061f9a37..bbdfa4068dbd61af1b907d1d3c677e49dbb49c97 100644 (file)
@@ -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 (&current_uiout, interp_ui_out (console));
+
+  return execute_control_command_1 (cmd);
+}
+
 /* Like execute_control_command, but first set
    suppress_next_print_command_trace.  */
 
index 9d0f8139ad2d723e24db73671a77d958bb727868..8c2fd90ea487777bd498566741f5035962ef1400 100644 (file)
@@ -1,3 +1,8 @@
+2017-10-31  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * gdb.mi/mi-break.exp (test_breakpoint_commands): Test backtrace
+       as a breakpoint command.
+
 2017-10-28  Maksim Dzabraev  <dzabraew@gmail.com>
 
        PR python/21213
index 38670c293ba8dcd400bb1e46a3b04e1c98acb897..41a48a1400d9fa1580b5a1d9e15bc83eeb512e7f 100644 (file)
@@ -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 {