tst_QProcess: move the crasher code to a header
So I can use it in tst_QProcess itself. This also modernizes it a bit by using __builtin_trap() where available. On x86-64, this expands to the ud2 instruction. Pick-to: 6.6 Change-Id: Ib5ce7a497e034ebabb2cfffd176288433378731b Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
parent
1dfa922606
commit
f992402f15
58
tests/auto/corelib/io/qprocess/crasher.h
Normal file
58
tests/auto/corelib/io/qprocess/crasher.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
// Copyright (C) 2016 The Qt Company Ltd.
|
||||||
|
// Copyright (C) 2020 Intel Corporation.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
# include <intrin.h>
|
||||||
|
#endif
|
||||||
|
#if __has_include(<signal.h>)
|
||||||
|
# include <signal.h>
|
||||||
|
#endif
|
||||||
|
#if __has_include(<sys/resource.h>)
|
||||||
|
# include <sys/resource.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __has_builtin
|
||||||
|
# define __has_builtin(x) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace tst_QProcessCrash {
|
||||||
|
struct NoCoreDumps
|
||||||
|
{
|
||||||
|
#if defined(RLIMIT_CORE)
|
||||||
|
struct rlimit rlim;
|
||||||
|
NoCoreDumps()
|
||||||
|
{
|
||||||
|
if (getrlimit(RLIMIT_CORE, &rlim) == 0 && rlim.rlim_cur != 0) {
|
||||||
|
struct rlimit newrlim = rlim;
|
||||||
|
newrlim.rlim_cur = 0;
|
||||||
|
setrlimit(RLIMIT_CORE, &newrlim);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
~NoCoreDumps()
|
||||||
|
{
|
||||||
|
setrlimit(RLIMIT_CORE, &rlim);
|
||||||
|
}
|
||||||
|
#endif // RLIMIT_CORE
|
||||||
|
};
|
||||||
|
|
||||||
|
void crashFallback(volatile int *ptr = nullptr)
|
||||||
|
{
|
||||||
|
*ptr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void crash()
|
||||||
|
{
|
||||||
|
#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
|
||||||
|
__ud2();
|
||||||
|
#elif __has_builtin(__builtin_trap)
|
||||||
|
__builtin_trap();
|
||||||
|
#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
|
||||||
|
asm("ud2");
|
||||||
|
#elif defined(SIGILL)
|
||||||
|
raise(SIGILL);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
crashFallback();
|
||||||
|
}
|
||||||
|
} // namespace tst_QProcessCrash
|
@ -2,49 +2,12 @@
|
|||||||
// Copyright (C) 2020 Intel Corporation.
|
// Copyright (C) 2020 Intel Corporation.
|
||||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
#if __has_include(<sys/resource.h>)
|
#include "../crasher.h"
|
||||||
# include <sys/resource.h>
|
using namespace tst_QProcessCrash;
|
||||||
# if defined(RLIMIT_CORE)
|
|
||||||
static bool disableCoreDumps()
|
|
||||||
{
|
|
||||||
// Unix: set our core dump limit to zero to request no dialogs.
|
|
||||||
if (struct rlimit rlim; getrlimit(RLIMIT_CORE, &rlim) == 0) {
|
|
||||||
rlim.rlim_cur = 0;
|
|
||||||
setrlimit(RLIMIT_CORE, &rlim);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
static bool disabledCoreDumps = disableCoreDumps();
|
|
||||||
# endif // RLIMIT_CORE
|
|
||||||
#endif // <sys/resource.h>
|
|
||||||
|
|
||||||
void crashFallback(volatile int *ptr = nullptr)
|
|
||||||
{
|
|
||||||
*ptr = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
# include <intrin.h>
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
# if defined(_M_IX86) || defined(_M_X64)
|
NoCoreDumps disableCoreDumps;
|
||||||
__ud2();
|
crash();
|
||||||
# endif
|
return 0;
|
||||||
|
|
||||||
crashFallback();
|
|
||||||
}
|
}
|
||||||
#elif defined(__MINGW32__)
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
asm("ud2");
|
|
||||||
crashFallback();
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
# include <stdlib.h>
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user