mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-01 20:12:01 +08:00
Do target_terminal_ours in query & friends instead of in all callers
Any time a caller calls query & friends / prompt_for_continue without ensuring that gdb owns the terminal for input is a bug. So do that in defaulted_query / prompt_for_continue directly instead. An example of a case where we currently miss calling target_terminal_ours is internal_error. Ever since defaulted_query was made to use gdb_readline_callback, there's no way to answer the internal error query if the internal error happens while the target is has the terminal: (gdb) c Continuing. .../src/gdb/linux-nat.c:1676: internal-error: linux_nat_resume: Assertion `dummy_counter < 10' failed. A problem internal to GDB has been detected, further debugging may prove unreliable. Quit this debugging session? (y or n) _ Entering 'y' or 'n' does not work, GDB does not respond. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> PR gdb/19828 * gnu-nat.c (inf_validate_task_sc): Don't call target_terminal_ours / target_terminal_inferior around query. * i386-tdep.c (i386_record_lea_modrm, i386_process_record): Don't call target_terminal_ours / target_terminal_inferior around yquery. * linux-record.c (record_linux_system_call): Don't call target_terminal_ours / target_terminal_inferior around yquery. * nto-procfs.c (interrupt_query): Don't call target_terminal_ours / target_terminal_inferior around query. * record-full.c (record_full_check_insn_num): Remove 'set_terminal' parameter. Don't call target_terminal_ours / target_terminal_inferior around query. (record_full_message, record_full_registers_change) (record_full_xfer_partial): Adjust. * remote.c (interrupt_query): Don't call target_terminal_ours / target_terminal_inferior around query. * utils.c (defaulted_query): Install cleanup to restore target terminal. Put target_terminal_ours_for_output in effect while defaulted producing, and target_terminal_ours in in effect while handling input. (prompt_for_continue): Install cleanup to restore target terminal. Put target_terminal_ours in in effect while handling input.
This commit is contained in:
16
gdb/utils.c
16
gdb/utils.c
@ -1274,12 +1274,15 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args)
|
||||
if (!confirm || server_command)
|
||||
return def_value;
|
||||
|
||||
old_chain = make_cleanup_restore_target_terminal ();
|
||||
|
||||
/* If input isn't coming from the user directly, just say what
|
||||
question we're asking, and then answer the default automatically. This
|
||||
way, important error messages don't get lost when talking to GDB
|
||||
over a pipe. */
|
||||
if (! input_from_terminal_p ())
|
||||
{
|
||||
target_terminal_ours_for_output ();
|
||||
wrap_here ("");
|
||||
vfprintf_filtered (gdb_stdout, ctlstr, args);
|
||||
|
||||
@ -1288,15 +1291,18 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args)
|
||||
y_string, n_string, def_answer);
|
||||
gdb_flush (gdb_stdout);
|
||||
|
||||
do_cleanups (old_chain);
|
||||
return def_value;
|
||||
}
|
||||
|
||||
if (deprecated_query_hook)
|
||||
{
|
||||
return deprecated_query_hook (ctlstr, args);
|
||||
}
|
||||
int res;
|
||||
|
||||
old_chain = make_cleanup (null_cleanup, NULL);
|
||||
res = deprecated_query_hook (ctlstr, args);
|
||||
do_cleanups (old_chain);
|
||||
return res;
|
||||
}
|
||||
|
||||
/* Format the question outside of the loop, to avoid reusing args. */
|
||||
question = xstrvprintf (ctlstr, args);
|
||||
@ -1310,6 +1316,9 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args)
|
||||
/* Used for calculating time spend waiting for user. */
|
||||
gettimeofday (&prompt_started, NULL);
|
||||
|
||||
/* We'll need to handle input. */
|
||||
target_terminal_ours ();
|
||||
|
||||
while (1)
|
||||
{
|
||||
char *response, answer;
|
||||
@ -1881,6 +1890,7 @@ prompt_for_continue (void)
|
||||
reinitialize_more_filter ();
|
||||
|
||||
/* We'll need to handle input. */
|
||||
make_cleanup_restore_target_terminal ();
|
||||
target_terminal_ours ();
|
||||
|
||||
/* Call gdb_readline_wrapper, not readline, in order to keep an
|
||||
|
Reference in New Issue
Block a user