diff options
Diffstat (limited to 'src/testlib/qtestcase.cpp')
-rw-r--r-- | src/testlib/qtestcase.cpp | 87 |
1 files changed, 49 insertions, 38 deletions
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index 88f9e899bf..05d1592a60 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -87,11 +87,9 @@ #endif #ifdef Q_OS_WIN -#ifndef Q_OS_WINCE # if !defined(Q_CC_MINGW) || (defined(Q_CC_MINGW) && defined(__MINGW64_VERSION_MAJOR)) # include <crtdbg.h> # endif -#endif #include <windows.h> // for Sleep #endif #ifdef Q_OS_UNIX @@ -111,6 +109,36 @@ QT_BEGIN_NAMESPACE using QtMiscUtils::toHexUpper; using QtMiscUtils::fromHex; +static bool debuggerPresent() +{ +#if defined(Q_OS_LINUX) + int fd = open("/proc/self/status", O_RDONLY); + if (fd == -1) + return false; + char buffer[2048]; + ssize_t size = read(fd, buffer, sizeof(buffer) - 1); + if (size == -1) { + close(fd); + return false; + } + buffer[size] = 0; + const char tracerPidToken[] = "\nTracerPid:"; + char *tracerPid = strstr(buffer, tracerPidToken); + if (!tracerPid) { + close(fd); + return false; + } + tracerPid += sizeof(tracerPidToken); + long int pid = strtol(tracerPid, &tracerPid, 10); + close(fd); + return pid != 0; +#elif defined(Q_OS_WIN) + return IsDebuggerPresent(); +#else + // TODO + return false; +#endif +} static void stackTrace() { @@ -118,6 +146,10 @@ static void stackTrace() const int disableStackDump = qEnvironmentVariableIntValue("QTEST_DISABLE_STACK_DUMP", &ok); if (ok && disableStackDump == 1) return; + + if (debuggerPresent()) + return; + #ifdef Q_OS_LINUX fprintf(stderr, "\n========= Received signal, dumping stack ==============\n"); char cmd[512]; @@ -1251,37 +1283,6 @@ char *toPrettyUnicode(const ushort *p, int length) return buffer.take(); } -static bool debuggerPresent() -{ -#if defined(Q_OS_LINUX) - int fd = open("/proc/self/status", O_RDONLY); - if (fd == -1) - return false; - char buffer[2048]; - ssize_t size = read(fd, buffer, sizeof(buffer) - 1); - if (size == -1) { - close(fd); - return false; - } - buffer[size] = 0; - const char tracerPidToken[] = "\nTracerPid:"; - char *tracerPid = strstr(buffer, tracerPidToken); - if (!tracerPid) { - close(fd); - return false; - } - tracerPid += sizeof(tracerPidToken); - long int pid = strtol(tracerPid, &tracerPid, 10); - close(fd); - return pid != 0; -#elif defined(Q_OS_WIN) - return IsDebuggerPresent(); -#else - // TODO - return false; -#endif -} - void TestMethods::invokeTests(QObject *testObject) const { const QMetaObject *metaObject = testObject->metaObject(); @@ -1380,7 +1381,9 @@ FatalSignalHandler::FatalSignalHandler() act.sa_flags = SA_RESETHAND; #endif -#ifdef SA_ONSTACK +// tvOS/watchOS both define SA_ONSTACK (in sys/signal.h) but mark sigaltstack() as +// unavailable (__WATCHOS_PROHIBITED __TVOS_PROHIBITED in signal.h) +#if defined(SA_ONSTACK) && !defined(Q_OS_TVOS) // Let the signal handlers use an alternate stack // This is necessary if SIGSEGV is to catch a stack overflow # if defined(Q_CC_GNU) && defined(Q_OF_ELF) @@ -1446,7 +1449,7 @@ FatalSignalHandler::~FatalSignalHandler() } // namespace -#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT) +#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) // Helper class for resolving symbol names by dynamically loading "dbghelp.dll". class DebugSymbolResolver @@ -1584,7 +1587,7 @@ static LONG WINAPI windowsFaultHandler(struct _EXCEPTION_POINTERS *exInfo) return EXCEPTION_EXECUTE_HANDLER; } -#endif // Q_OS_WIN) && !Q_OS_WINCE && !Q_OS_WINRT +#endif // Q_OS_WIN) && !Q_OS_WINRT static void initEnvironment() { @@ -1676,7 +1679,7 @@ int QTest::qExec(QObject *testObject, int argc, char **argv) qtest_qParseArgs(argc, argv, false); -#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) +#if defined(Q_OS_WIN) if (!noCrashHandler) { # ifndef Q_CC_MINGW _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG); @@ -1686,7 +1689,7 @@ int QTest::qExec(QObject *testObject, int argc, char **argv) SetUnhandledExceptionFilter(windowsFaultHandler); # endif } // !noCrashHandler -#endif // Q_OS_WIN) && !Q_OS_WINCE && !Q_OS_WINRT +#endif // Q_OS_WIN #ifdef QTESTLIB_USE_VALGRIND if (QBenchmarkGlobalData::current->mode() == QBenchmarkGlobalData::CallgrindParentProcess) { @@ -2421,6 +2424,14 @@ bool QTest::compare_string_helper(const char *t1, const char *t2, const char *ac \internal */ +/*! \fn bool QTest::qCompare(T *t, std::nullptr_t, const char *actual, const char *expected, const char *file, int line) + \internal +*/ + +/*! \fn bool QTest::qCompare(std::nullptr_t, T *t, const char *actual, const char *expected, const char *file, int line) + \internal +*/ + /*! \fn bool QTest::qCompare(T *t1, T *t2, const char *actual, const char *expected, const char *file, int line) \internal */ |