impr: Better OS-specific handling of system exceptions
This commit is contained in:
parent
242b100aa3
commit
8978e193db
@ -20,7 +20,9 @@
|
|||||||
#include <exception>
|
#include <exception>
|
||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
|
|
||||||
#if defined (OS_MACOS)
|
#if defined (OS_WINDOWS)
|
||||||
|
#include <windows.h>
|
||||||
|
#elif defined (OS_MACOS)
|
||||||
#include <sys/utsname.h>
|
#include <sys/utsname.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -166,22 +168,45 @@ namespace hex::crash {
|
|||||||
|
|
||||||
// Register signal handlers
|
// Register signal handlers
|
||||||
{
|
{
|
||||||
#define HANDLE_SIGNAL(name) \
|
#if defined(OS_WINDOWS)
|
||||||
std::signal(name, [](int signalNumber) { \
|
#define HANDLE_SIGNAL(name) case name: signalHandler(name, #name); break
|
||||||
signalHandler(signalNumber, #name); \
|
SetUnhandledExceptionFilter([](EXCEPTION_POINTERS* exceptionInfo) -> LONG {
|
||||||
})
|
switch (exceptionInfo->ExceptionRecord->ExceptionCode) {
|
||||||
|
HANDLE_SIGNAL(EXCEPTION_ACCESS_VIOLATION);
|
||||||
|
HANDLE_SIGNAL(EXCEPTION_ILLEGAL_INSTRUCTION);
|
||||||
|
HANDLE_SIGNAL(EXCEPTION_INT_DIVIDE_BY_ZERO);
|
||||||
|
HANDLE_SIGNAL(EXCEPTION_STACK_OVERFLOW);
|
||||||
|
HANDLE_SIGNAL(EXCEPTION_DATATYPE_MISALIGNMENT);
|
||||||
|
HANDLE_SIGNAL(EXCEPTION_ARRAY_BOUNDS_EXCEEDED);
|
||||||
|
}
|
||||||
|
|
||||||
HANDLE_SIGNAL(SIGSEGV);
|
return EXCEPTION_CONTINUE_SEARCH;
|
||||||
HANDLE_SIGNAL(SIGILL);
|
});
|
||||||
HANDLE_SIGNAL(SIGABRT);
|
#undef HANDLE_SIGNAL
|
||||||
HANDLE_SIGNAL(SIGFPE);
|
#else
|
||||||
HANDLE_SIGNAL(SIGINT);
|
#define HANDLE_SIGNAL(name) \
|
||||||
|
{ \
|
||||||
|
struct sigaction action = { }; \
|
||||||
|
action.sa_handler = [](int signalNumber) { \
|
||||||
|
signalHandler(signalNumber, #name); \
|
||||||
|
}; \
|
||||||
|
sigemptyset(&action.sa_mask); \
|
||||||
|
action.sa_flags = 0; \
|
||||||
|
sigaction(name, &action, nullptr); \
|
||||||
|
}
|
||||||
|
|
||||||
#if defined (SIGBUS)
|
HANDLE_SIGNAL(SIGSEGV);
|
||||||
HANDLE_SIGNAL(SIGBUS);
|
HANDLE_SIGNAL(SIGILL);
|
||||||
|
HANDLE_SIGNAL(SIGABRT);
|
||||||
|
HANDLE_SIGNAL(SIGFPE);
|
||||||
|
HANDLE_SIGNAL(SIGINT);
|
||||||
|
|
||||||
|
#if defined (SIGBUS)
|
||||||
|
HANDLE_SIGNAL(SIGBUS);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef HANDLE_SIGNAL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#undef HANDLE_SIGNAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure the uncaught exception handler
|
// Configure the uncaught exception handler
|
||||||
|
Loading…
x
Reference in New Issue
Block a user