[PATCHv2,5/6] gdb: register SIGBUS, SIGFPE, and SIGABRT handlers

Message ID d1fad7ed56ad9857a80e15b6595f78f6fd1cfeb0.1626890878.git.andrew.burgess@embecosm.com
State New
Headers show
Series
  • GDB Synchronous Signal Handling
Related show

Commit Message

Andrew Burgess July 21, 2021, 6:08 p.m.
Register handlers for SIGBUS, SIGFPE, and SIGABRT.  All of these
signals are setup as fatal signals that will cause GDB to terminate.
However, by passing these signals through the handle_fatal_signal
function, a user can arrange to see a backtrace when GDB
terminates (see maint set backtrace-on-fatal-signal).

In normal use of GDB there should be no user visible changes after
this commit.  Only if GDB terminates with one of the above signals
will GDB change slightly, potentially printing a backtrace before
aborting.

I've added new tests for SIGFPE, SIGBUS, and SIGABRT.
---
 gdb/event-top.c                               | 17 ++++++++++++++++-
 gdb/testsuite/gdb.base/bt-on-fatal-signal.exp |  5 ++++-
 2 files changed, 20 insertions(+), 2 deletions(-)

-- 
2.25.4

Patch

diff --git a/gdb/event-top.c b/gdb/event-top.c
index b5dfd43f621..349f0f26ce4 100644
--- a/gdb/event-top.c
+++ b/gdb/event-top.c
@@ -1025,7 +1025,10 @@  static struct serial_event *quit_serial_event;
    with the reception of the signal.
 
    For SIGSEGV the handle_sig* function does all the work for handling this
-   signal.  */
+   signal.
+
+   For SIGFPE, SIGBUS, and SIGABRT, these signals will all cause GDB to
+   terminate immediately.  */
 void
 gdb_init_signals (void)
 {
@@ -1061,6 +1064,18 @@  gdb_init_signals (void)
     create_async_signal_handler (async_sigtstp_handler, NULL, "sigtstp");
 #endif
 
+#ifdef SIGFPE
+  signal (SIGFPE, handle_fatal_signal);
+#endif
+
+#ifdef SIGBUS
+  signal (SIGBUS, handle_fatal_signal);
+#endif
+
+#ifdef SIGABRT
+  signal (SIGABRT, handle_fatal_signal);
+#endif
+
   install_handle_sigsegv ();
 }
 
diff --git a/gdb/testsuite/gdb.base/bt-on-fatal-signal.exp b/gdb/testsuite/gdb.base/bt-on-fatal-signal.exp
index 7a9f8e45fde..8875d00fdb1 100644
--- a/gdb/testsuite/gdb.base/bt-on-fatal-signal.exp
+++ b/gdb/testsuite/gdb.base/bt-on-fatal-signal.exp
@@ -54,7 +54,10 @@  gdb_test_multiple "maint set backtrace-on-fatal-signal on" "" {
 }
 
 # Now the actual test loop.
-foreach test_data {{SEGV "Segmentation fault"}} {
+foreach test_data {{SEGV "Segmentation fault"} \
+		       {FPE "Floating point exception"} \
+		       {BUS "Bus error"} \
+		       {ABRT "Aborted"}} {
     set sig [lindex ${test_data} 0]
     set msg [lindex ${test_data} 1]
     with_test_prefix ${sig} {