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>
This commit is contained in:
Thiago Macieira 2022-05-03 19:37:47 -07:00
parent 2e9bc3494f
commit 17454bf9c6
3 changed files with 36 additions and 4 deletions

View File

@ -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) {

View File

@ -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.

View File

@ -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