]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
Put the inferior's terminal settings in effect while running (fg) infcalls
authorPedro Alves <palves@redhat.com>
Mon, 14 Jul 2014 18:55:30 +0000 (19:55 +0100)
committerPedro Alves <palves@redhat.com>
Mon, 14 Jul 2014 18:55:30 +0000 (19:55 +0100)
commitc933f875f4416a2a06c14fb9e483dd888a948eb2
treeaf33994bf7f208f11e6b88a13df83de360ce27e8
parentfeb6f816c2246f29e1f71db11a757cbf99c25492
Put the inferior's terminal settings in effect while running (fg) infcalls

The "call" and "print" commands presently always run synchronously, in
the foreground, but GDB currently forgets to put the inferior's
terminal settings into effect while running them, on async-capable
targets, resulting in:

 (gdb) print func ()
 hello world

 Program received signal SIGTTOU, Stopped (tty output).
 0x000000373bceb8d0 in __libc_tcdrain (fd=1) at ../sysdeps/unix/sysv/linux/tcdrain.c:29
 29          return INLINE_SYSCALL (ioctl, 3, fd, TCSBRK, 1);
 The program being debugged was signaled while in a function called from GDB.
 GDB remains in the frame where the signal was received.
 To change this behavior use "set unwindonsignal on".
 Evaluation of the expression containing the function
 (func) will be abandoned.
 When the function is done executing, GDB will silently stop.
 (gdb)

That's because target_terminal_inferior skips actually doing anything
if running in the background, and, nothing is setting sync_execution
while running infcalls:

 void
 target_terminal_inferior (void)
 {
   /* A background resume (``run&'') should leave GDB in control of the
      terminal.  Use target_can_async_p, not target_is_async_p, since at
      this point the target is not async yet.  However, if sync_execution
      is not set, we know it will become async prior to resume.  */
   if (target_can_async_p () && !sync_execution)
     return;

This would best be all cleaned up by making GDB not even call
target_terminal_inferior and try to pass the terminal to the inferior
if running in the background, but that's a more invasive fix that is
better done post-7.8.

This was originally caught by a patch later in this series that makes
catch_command_errors use exception_print instead of
print_any_exception.  Note that print_flush calls serial_drain_output
while print_any_exception doesnt't have that bit.  And,
gdb.gdb/python-selftest.exp does:

 gdb_test "call catch_command_errors(execute_command, \"python print 5\", 0, RETURN_MASK_ALL)" \
   "Python not initialized.* = 0"

which without this fix results in SIGTTOU...

gdb/
2014-07-14  Pedro Alves  <palves@redhat.com>

* infcall.c (run_inferior_call): Set 'sync_execution' while
running the inferior call.

gdb/testsuite/
2014-07-14  Pedro Alves  <palves@redhat.com>

* gdb.base/execution-termios.c: New file.
* gdb.base/execution-termios.exp: New file.
gdb/ChangeLog
gdb/infcall.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/execution-termios.c [new file with mode: 0644]
gdb/testsuite/gdb.base/execution-termios.exp [new file with mode: 0644]