gdb/main: execute breakpoint commands for '-iex' and '-ex' commands
authorTankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Mon, 7 Dec 2020 08:03:24 +0000 (09:03 +0100)
committerTankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Mon, 7 Dec 2020 08:10:51 +0000 (09:10 +0100)
commit21e051b3d666bcd614391142a936a8a8cccfa3cb
treec22b5f525e6b89afe9a57755f966fd1a29cedcb7
parentf51f9f1d0300029d33ecb73976f5d2be9b63553e
gdb/main: execute breakpoint commands for '-iex' and '-ex' commands

Suppose we have the script file below:

  break main
  commands
    print 123
  end
  run

If started with this script file, GDB executes the breakpoint command:

  $ gdb -q -x myscript --args ./test
  Reading symbols from ./test...
  Breakpoint 1 at 0x114e: file test.c, line 2.

  Breakpoint 1, main () at test.c:2
  2         return 0;
  $1 = 123
  (gdb)

However, if we remove the "run" line from the script and pass it with
the '-ex' option instead, the command is not executed:

  $ gdb -q -x myscript_no_run --args ./test
  Reading symbols from ./test...
  Breakpoint 1 at 0x114e: file test.c, line 2.
  Starting program: /path/to/test

  Breakpoint 1, main () at test.c:2
  2         return 0;
  (gdb)

If the user enters a command at this point, the breakpoint command
is executed, yielding weird output:

  $ gdb -q -x myscript_no_run --args ./test
  Reading symbols from ./test...
  Breakpoint 1 at 0x114e: file test.c, line 2.
  Starting program: /path/to/test

  Breakpoint 1, main () at test.c:2
  2         return 0;
  (gdb) print "a"
  $1 = "a"
  $2 = 123

When consuming script files, GDB runs bp actions after executing a
command.  See `command_handler` in event-top.c:

  if (c[0] != '#')
    {
      execute_command (command, ui->instream == ui->stdin_stream);

      /* Do any commands attached to breakpoint we stopped at.  */
      bpstat_do_actions ();
    }

However, for '-ex' commands, `bpstat_do_actions` is not invoked.
Hence, the misaligned output explained above occurs.  To fix the
problem, add a call to `bpstat_do_actions` after executing a command.

gdb/ChangeLog:
2020-12-07  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

* main.c (catch_command_errors): Add a flag parameter; invoke
`bpstat_do_actions` if the flag is set.
(execute_cmdargs): Update a call to `catch_command_errors`.

gdb/testsuite/ChangeLog:
2020-12-07  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

* gdb.base/bp-cmds-run-with-ex.c: New file.
* gdb.base/bp-cmds-run-with-ex.exp: New file.
* gdb.base/bp-cmds-run-with-ex.gdb: New file.
* gdb.gdb/python-interrupts.exp: Update the call to
'catch_command_errors' with the new argument.
* gdb.gdb/python-selftest.exp: Ditto.
gdb/ChangeLog
gdb/main.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/bp-cmds-run-with-ex.c [new file with mode: 0644]
gdb/testsuite/gdb.base/bp-cmds-run-with-ex.exp [new file with mode: 0644]
gdb/testsuite/gdb.base/bp-cmds-run-with-ex.gdb [new file with mode: 0644]
gdb/testsuite/gdb.gdb/python-interrupts.exp
gdb/testsuite/gdb.gdb/python-selftest.exp