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:
parent
2e9bc3494f
commit
17454bf9c6
@ -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) {
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user