mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-21 04:42:53 +08:00
d3d4baedb6
This is more of a readline/terminal issue than a Python one.
PR17372 is a regression in 7.8 caused by the fix for PR17072:
commit 0017922d02
Author: Pedro Alves <palves@redhat.com>
Date: Mon Jul 14 19:55:32 2014 +0100
Background execution + pagination aborts readline/gdb
gdb_readline_wrapper_line removes the handler after a line is
processed. Usually, we'll end up re-displaying the prompt, and that
reinstalls the handler. But if the output is coming out of handling
a stop event, we don't re-display the prompt, and nothing restores the
handler. So the next input wakes up the event loop and calls into
readline, which aborts.
...
gdb/
2014-07-14 Pedro Alves <palves@redhat.com>
PR gdb/17072
* top.c (gdb_readline_wrapper_line): Tweak comment.
(gdb_readline_wrapper_cleanup): If readline is enabled, reinstall
the input handler callback.
The problem is that installing the input handler callback also preps
the terminal, putting it in raw mode and with echo disabled, which is
bad if we're going to call a command that assumes cooked/canonical
mode, and echo enabled, like in the case of the PR, Python's
interactive shell. Another example I came up with that doesn't depend
on Python is starting a subshell with "(gdb) shell /bin/sh" from a
multi-line command. Tests covering both these examples are added.
The fix is to revert the original fix for PR gdb/17072, and instead
restore the callback handler after processing an asynchronous target
event.
Furthermore, calling rl_callback_handler_install when we already have
some input in readline's line buffer discards that input, which is
obviously a bad thing to do while the user is typing. No specific
test is added for that, because I first tried calling it even if the
callback handler was still installed and that resulted in hundreds of
failures in the testsuite.
gdb/
2014-10-29 Pedro Alves <palves@redhat.com>
PR python/17372
* event-top.c (change_line_handler): Call
gdb_rl_callback_handler_remove instead of
rl_callback_handler_remove.
(callback_handler_installed): New global.
(gdb_rl_callback_handler_remove, gdb_rl_callback_handler_install)
(gdb_rl_callback_handler_reinstall): New functions.
(display_gdb_prompt): Call gdb_rl_callback_handler_remove and
gdb_rl_callback_handler_install instead of
rl_callback_handler_remove and rl_callback_handler_install.
(gdb_disable_readline): Call gdb_rl_callback_handler_remove
instead of rl_callback_handler_remove.
* event-top.h (gdb_rl_callback_handler_remove)
(gdb_rl_callback_handler_install)
(gdb_rl_callback_handler_reinstall): New declarations.
* infrun.c (reinstall_readline_callback_handler_cleanup): New
cleanup function.
(fetch_inferior_event): Install it.
* top.c (gdb_readline_wrapper_line) Call
gdb_rl_callback_handler_remove instead of
rl_callback_handler_remove.
(gdb_readline_wrapper_cleanup): Don't call
rl_callback_handler_install.
gdb/testsuite/
2014-10-29 Pedro Alves <palves@redhat.com>
PR python/17372
* gdb.python/python.exp: Test a multi-line command that spawns
interactive Python.
* gdb.base/multi-line-starts-subshell.exp: New file.
79 lines
2.7 KiB
C
79 lines
2.7 KiB
C
/* Definitions used by event-top.c, for GDB, the GNU debugger.
|
|
|
|
Copyright (C) 1999-2014 Free Software Foundation, Inc.
|
|
|
|
Written by Elena Zannoni <ezannoni@cygnus.com> of Cygnus Solutions.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef EVENT_TOP_H
|
|
#define EVENT_TOP_H
|
|
|
|
struct cmd_list_element;
|
|
|
|
/* Exported functions from event-top.c.
|
|
FIXME: these should really go into top.h. */
|
|
|
|
extern void display_gdb_prompt (char *new_prompt);
|
|
void gdb_setup_readline (void);
|
|
void gdb_disable_readline (void);
|
|
extern void async_init_signals (void);
|
|
extern void set_async_editing_command (char *args, int from_tty,
|
|
struct cmd_list_element *c);
|
|
|
|
/* Signal to catch ^Z typed while reading a command: SIGTSTP or SIGCONT. */
|
|
#ifndef STOP_SIGNAL
|
|
#include <signal.h>
|
|
#ifdef SIGTSTP
|
|
#define STOP_SIGNAL SIGTSTP
|
|
extern void handle_stop_sig (int sig);
|
|
#endif
|
|
#endif
|
|
extern void handle_sigint (int sig);
|
|
extern void handle_sigterm (int sig);
|
|
extern void gdb_readline2 (void *client_data);
|
|
extern void async_request_quit (void *arg);
|
|
extern void stdin_event_handler (int error, void *client_data);
|
|
extern void async_disable_stdin (void);
|
|
extern void async_enable_stdin (void);
|
|
|
|
/* Exported variables from event-top.c.
|
|
FIXME: these should really go into top.h. */
|
|
|
|
extern int async_command_editing_p;
|
|
extern int exec_done_display_p;
|
|
extern char *async_annotation_suffix;
|
|
extern struct prompts the_prompts;
|
|
extern void (*call_readline) (void *);
|
|
extern void (*input_handler) (char *);
|
|
extern int input_fd;
|
|
extern void (*after_char_processing_hook) (void);
|
|
|
|
/* Wrappers for rl_callback_handler_remove and
|
|
rl_callback_handler_install that keep track of whether the callback
|
|
handler is installed in readline. Do not call the readline
|
|
versions directly. */
|
|
extern void gdb_rl_callback_handler_remove (void);
|
|
extern void gdb_rl_callback_handler_install (const char *prompt);
|
|
|
|
/* Reinstall the readline callback handler (with no prompt), if not
|
|
currently installed. */
|
|
extern void gdb_rl_callback_handler_reinstall (void);
|
|
|
|
extern void cli_command_loop (void *);
|
|
|
|
#endif
|