diff options
author | Pedro Alves <palves@redhat.com> | 2014-07-14 19:55:32 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2014-07-14 20:34:23 +0100 |
commit | 1e9735707b34b8141ea3bfd88205ea26e99891fc (patch) | |
tree | 62ba3c6b7851fa9438c6d5b2e4fea830e69621f9 /gdb/ada-lang.c | |
parent | 93d6eb10ede1d8b72b274345c63f66439eaf7fd0 (diff) | |
download | gdb-1e9735707b34b8141ea3bfd88205ea26e99891fc.zip gdb-1e9735707b34b8141ea3bfd88205ea26e99891fc.tar.gz gdb-1e9735707b34b8141ea3bfd88205ea26e99891fc.tar.bz2 |
Fix double prompt
If an error is thrown while handling a target event (within
fetch_inferior_event), and, the interpreter is not async (but the
target is), then GDB prints the prompt twice.
One way to see that in action is throw a QUIT while in a pagination
prompt issued from within fetch_inferior_event (or one of its
callees). E.g. from the test:
---Type <return> to continue, or q <return> to quit---
^CQuit
(gdb) (gdb) p 1
^^^^^^^^^^^
$1 = 1
(gdb)
The issue is that inferior_event_handler swallows errors and notifies
the observers (the interpreters) about the command error, even if the
interpreter is forced sync while we're handling a nested event loop
(for execute_command). The observers print a prompt, and then when we
get back to the top event loop, we print another (in
start_event_loop).
I see no reason the error should be swallowed here. Just cancel the
execution related bits and let the error propagate to the top level
(start_event_loop), which re-enables stdin and notifies observers.
gdb/
2014-07-14 Pedro Alves <palves@redhat.com>
* inf-loop.c (inferior_event_handler): Use TRY_CATCH instead of
catch_errors. Don't re-enable stdin or notify observers where,
and rethrow error.
(fetch_inferior_event_wrapper): Delete.
gdb/testsuite/
2014-07-14 Pedro Alves <palves@redhat.com>
* gdb.base/double-prompt-target-event-error.c: New file.
* gdb.base/double-prompt-target-event-error.exp: New file.
Diffstat (limited to 'gdb/ada-lang.c')
0 files changed, 0 insertions, 0 deletions