1
0
mirror of synced 2025-02-02 04:17:56 +01:00

impr: Better OS-specific handling of system exceptions

This commit is contained in:
WerWolv 2025-01-21 23:28:12 +01:00
parent 242b100aa3
commit 8978e193db

View File

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