diff options
author | Tom de Vries <tdevries@suse.de> | 2024-05-10 08:46:21 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2024-05-10 08:46:21 +0200 |
commit | 408bc9c5fc757bd4b8adb1c3d54ecd672beaedb7 (patch) | |
tree | 9560990d965f8dc9477ca40c1d4ad9afd8f421ad | |
parent | 65924bda46ffd8d9746ef0100789ddacf3f51097 (diff) | |
download | gdb-408bc9c5fc757bd4b8adb1c3d54ecd672beaedb7.zip gdb-408bc9c5fc757bd4b8adb1c3d54ecd672beaedb7.tar.gz gdb-408bc9c5fc757bd4b8adb1c3d54ecd672beaedb7.tar.bz2 |
[gdb/python] Make gdb.UnwindInfo.add_saved_register more robust (fixup)
In commit 2236c5e384d ("[gdb/python] Make gdb.UnwindInfo.add_saved_register
more robust") I added this code in unwind_infopy_add_saved_register:
...
if (value->optimized_out () || !value->entirely_available ())
...
which may throw c++ exceptions.
This needs to be caught and transformed into a python exception.
Fix this by using GDB_PY_HANDLE_EXCEPTION.
Tested on x86_64-linux.
Approved-By: Tom Tromey <tom@tromey.com>
Fixes: 2236c5e384d ("[gdb/python] Make gdb.UnwindInfo.add_saved_register more robust")
-rw-r--r-- | gdb/python/py-unwind.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c index 18125e5..e36768e 100644 --- a/gdb/python/py-unwind.c +++ b/gdb/python/py-unwind.c @@ -361,16 +361,24 @@ unwind_infopy_add_saved_register (PyObject *self, PyObject *args, PyObject *kw) return nullptr; } - if (value->optimized_out () || !value->entirely_available ()) + + try + { + if (value->optimized_out () || !value->entirely_available ()) + { + /* If we allow this value to be registered here, pyuw_sniffer is going + to run into an exception when trying to access its contents. + Throwing an exception here just puts a burden on the user to + implement the same checks on the user side. We could return False + here and True otherwise, but again that might require changes in + user code. So, handle this with minimal impact for the user, while + improving robustness: silently ignore the register/value pair. */ + Py_RETURN_NONE; + } + } + catch (const gdb_exception &except) { - /* If we allow this value to be registered here, pyuw_sniffer is going - to run into an exception when trying to access its contents. - Throwing an exception here just puts a burden on the user to - implement the same checks on the user side. We could return False - here and True otherwise, but again that might require changes in user - code. So, handle this with minimal impact for the user, while - improving robustness: silently ignore the register/value pair. */ - Py_RETURN_NONE; + GDB_PY_HANDLE_EXCEPTION (except); } gdbpy_ref<> new_value = gdbpy_ref<>::new_reference (pyo_reg_value); |