aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2024-09-24 16:45:27 +0200
committerTom de Vries <tdevries@suse.de>2024-09-24 16:45:27 +0200
commit6896412cde41009ad2c9e7dc49640696ee963b68 (patch)
tree7ddad254329380b7af8b5ccb2d3c0abdab68ef1a
parent2299dfd4ba96c6852db862f6ec1b96880ecd6c0c (diff)
downloadbinutils-6896412cde41009ad2c9e7dc49640696ee963b68.zip
binutils-6896412cde41009ad2c9e7dc49640696ee963b68.tar.gz
binutils-6896412cde41009ad2c9e7dc49640696ee963b68.tar.bz2
[gdb] Handle SIGTERM in run_events
While reviewing "catch (...)" uses I came across: ... for (auto &item : local) { try { item (); } catch (...) { /* Ignore exceptions in the callback. */ } } ... This means that when an item throws a gdb_exception_forced_quit, the exception is ignored and following items are executed. Fix this by handling gdb_exception_forced_quit explicity, and immediately rethrowing it. I wondered about ^C, and couldn't decide whether current behaviour is ok, so I left this alone, but I made the issue explicit in the source code. As for the "catch (...)", I think that it should let a non-gdb_exception propagate, so I've narrowed it to "catch (const gdb_exception &)". My rationale for this is as follows. There seem to be a few ways that "catch (...)" is allowed in gdb: - clean-up and rethrow (basically the SCOPE_EXIT pattern) - catch and handle an exception from a call into an external c++ library Since we're dealing with neither of those here, we remove the "catch (...)". Tested on aarch64-linux. Approved-By: Tom Tromey <tom@tromey.com>
-rw-r--r--gdb/run-on-main-thread.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/gdb/run-on-main-thread.c b/gdb/run-on-main-thread.c
index e30daba..a6213d4 100644
--- a/gdb/run-on-main-thread.c
+++ b/gdb/run-on-main-thread.c
@@ -74,7 +74,20 @@ run_events (int error, gdb_client_data client_data)
{
item ();
}
- catch (...)
+ catch (const gdb_exception_forced_quit &e)
+ {
+ /* GDB is terminating, so:
+ - make sure this is propagated, and
+ - no need to keep running things, so propagate immediately. */
+ throw;
+ }
+ catch (const gdb_exception_quit &e)
+ {
+ /* Should cancelation of a runnable event cancel the execution of
+ the following one? The answer is not clear, so keep doing what
+ we've done sofar: ignore this exception. */
+ }
+ catch (const gdb_exception &)
{
/* Ignore exceptions in the callback. */
}