diff options
author | Andrew Burgess <andrew.burgess@embecosm.com> | 2019-11-19 11:17:20 +0000 |
---|---|---|
committer | Andrew Burgess <andrew.burgess@embecosm.com> | 2020-01-24 00:11:53 +0000 |
commit | 1ba1ac88011703abcd0271e4f5d00927dc69a09a (patch) | |
tree | 4a879eb157f7949da1c165e7b9b641e631997ec8 /gdb/python/python.c | |
parent | f3364a6d0fefe44fc26a1d5025b3af55ecec5cad (diff) | |
download | binutils-1ba1ac88011703abcd0271e4f5d00927dc69a09a.zip binutils-1ba1ac88011703abcd0271e4f5d00927dc69a09a.tar.gz binutils-1ba1ac88011703abcd0271e4f5d00927dc69a09a.tar.bz2 |
gdb: Enable stdin on exception in execute_gdb_command
This is an update of this patch:
https://sourceware.org/ml/gdb-patches/2018-09/msg00884.html
This patch attempts to address PR gdb/23718 by re-enabling stdin
whenever an exception is caught during gdb.execute().
When Python gdb.execute() is called, an exception could occur (e.g. the
target disappearing), which is then converted into a Python exception. If
stdin was disabled before the exception is caught, it is not re-enabled,
because the exception doesn't propagate to the top level of the event loop,
whose catch block would otherwise enable it.
The result is that when execution of a Python script completes, GDB does
not prompt or accept input, and is effectively hung.
This change rectifies the issue by re-enabling stdin in the catch block of
execute_gdb_command, prior to converting the exception to a Python
exception.
Since this patch was originally posted I've added a test, and also I
converted the code to re-enable stdin from this:
SWITCH_THRU_ALL_UIS ()
{
async_enable_stdin ();
}
to simply this:
async_enable_stdin ();
My reasoning is that we only need the SWITCH_THRU_ALL_UIS if, at the time
the exception is caught, the current_ui might be different than at the time
we called async_disable_stdin. Within python's execute_gdb_command I think
it should be impossible to switch current_ui, so the SWITCH_THRU_ALL_UIS
isn't needed.
gdb/ChangeLog:
PR gdb/23718
* gdb/python/python.c (execute_gdb_command): Call
async_enable_stdin in catch block.
gdb/testsuite/ChangeLog:
PR gdb/23718
* gdb.server/server-kill-python.exp: New file.
Change-Id: I1cfc36ee9f8484cc1ed82be9be338353db6bc080
Diffstat (limited to 'gdb/python/python.c')
-rw-r--r-- | gdb/python/python.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/gdb/python/python.c b/gdb/python/python.c index f75c7b1..27d6042 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -624,6 +624,12 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) } catch (const gdb_exception &except) { + /* If an exception occurred then we won't hit normal_stop (), or have + an exception reach the top level of the event loop, which are the + two usual places in which stdin would be re-enabled. So, before we + convert the exception and continue back in Python, we should + re-enable stdin here. */ + async_enable_stdin (); GDB_PY_HANDLE_EXCEPTION (except); } |