diff options
author | Tom de Vries <tdevries@suse.de> | 2024-09-24 16:45:27 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2024-09-24 16:45:27 +0200 |
commit | 6896412cde41009ad2c9e7dc49640696ee963b68 (patch) | |
tree | 7ddad254329380b7af8b5ccb2d3c0abdab68ef1a | |
parent | 2299dfd4ba96c6852db862f6ec1b96880ecd6c0c (diff) | |
download | binutils-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.c | 15 |
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. */ } |