impr: Better OS-specific handling of system exceptions
This commit is contained in:
parent
242b100aa3
commit
8978e193db
@ -20,7 +20,9 @@
|
||||
#include <exception>
|
||||
#include <typeinfo>
|
||||
|
||||
#if defined (OS_MACOS)
|
||||
#if defined (OS_WINDOWS)
|
||||
#include <windows.h>
|
||||
#elif defined (OS_MACOS)
|
||||
#include <sys/utsname.h>
|
||||
#endif
|
||||
|
||||
@ -166,10 +168,32 @@ namespace hex::crash {
|
||||
|
||||
// Register signal handlers
|
||||
{
|
||||
#if defined(OS_WINDOWS)
|
||||
#define HANDLE_SIGNAL(name) case name: signalHandler(name, #name); break
|
||||
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);
|
||||
}
|
||||
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
});
|
||||
#undef HANDLE_SIGNAL
|
||||
#else
|
||||
#define HANDLE_SIGNAL(name) \
|
||||
std::signal(name, [](int signalNumber) { \
|
||||
{ \
|
||||
struct sigaction action = { }; \
|
||||
action.sa_handler = [](int signalNumber) { \
|
||||
signalHandler(signalNumber, #name); \
|
||||
})
|
||||
}; \
|
||||
sigemptyset(&action.sa_mask); \
|
||||
action.sa_flags = 0; \
|
||||
sigaction(name, &action, nullptr); \
|
||||
}
|
||||
|
||||
HANDLE_SIGNAL(SIGSEGV);
|
||||
HANDLE_SIGNAL(SIGILL);
|
||||
@ -182,6 +206,7 @@ namespace hex::crash {
|
||||
#endif
|
||||
|
||||
#undef HANDLE_SIGNAL
|
||||
#endif
|
||||
}
|
||||
|
||||
// Configure the uncaught exception handler
|
||||
|
Loading…
x
Reference in New Issue
Block a user