summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2022-05-03 19:37:47 -0700
committerThiago Macieira <thiago.macieira@intel.com>2022-06-08 20:39:18 +0000
commit17454bf9c60d9a7f836461234f48e1bb9d7d5bf9 (patch)
tree86cc39c57efd8855b784a714ded59acbc70e60ce
parent2e9bc3494f62761660e6ae9b5cc6caa0e170ca9a (diff)
FatalSignalHandler: print the signal name on crash
It's easier to remember what "SIGSEGV" means instead of "11". GNU libc has offered sigabbrev_np() (non-portable) since 2.32; for older libcs, we'll be happy with a hardcoded list. Selftest updated to match... though it didn't seem to be necessary. Pick-to: 6.4 Change-Id: I5ff8e16fcdcb4ffd9ab6fffd16ebc66ecf6e9465 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
-rw-r--r--src/testlib/qtestcase.cpp36
-rw-r--r--tests/auto/testlib/selftests/expected_crashes_4.txt2
-rw-r--r--tests/auto/testlib/selftests/expected_crashes_5.txt2
3 files changed, 36 insertions, 4 deletions
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index 2d329477c8..ed9b52244a 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -1910,9 +1910,40 @@ using FatalSignalHandler = WindowsFaultHandler;
class FatalSignalHandler
{
public:
+# define OUR_SIGNALS(F) \
+ F(HUP) \
+ F(INT) \
+ F(QUIT) \
+ F(ABRT) \
+ F(ILL) \
+ F(BUS) \
+ F(FPE) \
+ F(SEGV) \
+ F(PIPE) \
+ F(TERM) \
+ /**/
+# define CASE_LABEL(S) case SIG ## S: return QT_STRINGIFY(S);
+# define ENUMERATE_SIGNALS(S) SIG ## S,
+ static const char *signalName(int signum) noexcept
+ {
+ switch (signum) {
+ OUR_SIGNALS(CASE_LABEL)
+ }
+
+# if defined(__GLIBC_MINOR__) && (__GLIBC_MINOR__ >= 32 || __GLIBC__ > 2)
+ // get the other signal names from glibc 2.32
+ // (accessing the sys_sigabbrev variable causes linker warnings)
+ if (const char *p = sigabbrev_np(signum))
+ return p;
+# endif
+ return "???";
+ }
static constexpr std::array fatalSignals = {
- SIGHUP, SIGINT, SIGQUIT, SIGABRT, SIGILL, SIGBUS, SIGFPE, SIGSEGV, SIGPIPE, SIGTERM
+ OUR_SIGNALS(ENUMERATE_SIGNALS)
};
+# undef CASE_LABEL
+# undef ENUMERATE_SIGNALS
+
static constexpr std::array crashingSignals = {
// Crash signals are special, because if we return from the handler
// without adjusting the machine state, the same instruction that
@@ -2047,7 +2078,8 @@ private:
static void actionHandler(int signum, siginfo_t * /* info */, void * /* ucontext */)
{
- writeToStderr("Received signal ", asyncSafeToString(signum), "\n");
+ writeToStderr("Received signal ", asyncSafeToString(signum),
+ " (SIG", signalName(signum), ")\n");
printTestRunTime();
if (signum != SIGINT) {
diff --git a/tests/auto/testlib/selftests/expected_crashes_4.txt b/tests/auto/testlib/selftests/expected_crashes_4.txt
index 90ae91b8ba..6bb9b3ecf8 100644
--- a/tests/auto/testlib/selftests/expected_crashes_4.txt
+++ b/tests/auto/testlib/selftests/expected_crashes_4.txt
@@ -1,6 +1,6 @@
********* Start testing of tst_Crashes *********
Config: Using QtTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
PASS : tst_Crashes::initTestCase()
-QFATAL : tst_Crashes::crash() Received signal 11
+QFATAL : tst_Crashes::crash() Received signal 11 (SIGSEGV)
Function time: ms Total time: ms
FAIL! : tst_Crashes::crash() Received a fatal error.
diff --git a/tests/auto/testlib/selftests/expected_crashes_5.txt b/tests/auto/testlib/selftests/expected_crashes_5.txt
index 088b9c5324..a7df64e823 100644
--- a/tests/auto/testlib/selftests/expected_crashes_5.txt
+++ b/tests/auto/testlib/selftests/expected_crashes_5.txt
@@ -1,5 +1,5 @@
********* Start testing of tst_Crashes *********
Config: Using QtTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
PASS : tst_Crashes::initTestCase()
-QFATAL : tst_Crashes::crash() Received signal 11
+QFATAL : tst_Crashes::crash() Received signal 11 (SIGSEGV)
Function time: ms Total time: ms