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.
Showing
- gdb/ChangeLog 7 additions, 0 deletionsgdb/ChangeLog
- gdb/inf-loop.c 17 additions, 19 deletionsgdb/inf-loop.c
- gdb/testsuite/ChangeLog 5 additions, 0 deletionsgdb/testsuite/ChangeLog
- gdb/testsuite/gdb.base/double-prompt-target-event-error.c 25 additions, 0 deletionsgdb/testsuite/gdb.base/double-prompt-target-event-error.c
- gdb/testsuite/gdb.base/double-prompt-target-event-error.exp 111 additions, 0 deletionsgdb/testsuite/gdb.base/double-prompt-target-event-error.exp
Loading
Please register or sign in to comment