void StdInvokeSignal( _In_ int Signal, _In_ Context_t* Context) { sig_element* sig = NULL; int fatal; int i; // 3 of the signals are relatively harmless and we can continue after fatal = Signal != SIGINT && Signal != SIGUSR1 && Signal != SIGUSR2; // Find handler for(i = 0; i < sizeof(signal_list) / sizeof(signal_list[0]); i++) { if (signal_list[i].signal == Signal) { sig = &signal_list[i]; break; } } // Check against unsupported signal if (sig != NULL) { CreateSignalInformation(Signal); if (sig->handler != SIG_IGN) { if (sig->handler == SIG_DFL || sig->handler == SIG_ERR) { if (sig->handler == SIG_ERR || signal_fatality[Signal] == 1 || signal_fatality[Signal] == 2) { DefaultCrashHandler(sig, Context); } } else { sig->handler(Signal); } } } // Unhandled signal, or division by zero specifically? if (sig == NULL) { sig_element _static_sig = { .signal = Signal }; DefaultCrashHandler(&_static_sig, Context); }
/** True system-specific crash handler that gets called first */ void PlatformCrashHandler(int32 Signal, siginfo_t* Info, void* Context) { fprintf(stderr, "Signal %d caught.\n", Signal); FLinuxCrashContext CrashContext; CrashContext.InitFromSignal(Signal, Info, Context); if (GCrashHandlerPointer) { GCrashHandlerPointer(CrashContext); } else { // call default one DefaultCrashHandler(CrashContext); } }
/** True system-specific crash handler that gets called first */ void PlatformCrashHandler(int32 Signal, siginfo_t* Info, void* Context) { fprintf(stderr, "Signal %d caught.\n", Signal); // Switch to malloc crash. FPlatformMallocCrash::Get().SetAsGMalloc(); FLinuxCrashContext CrashContext; CrashContext.InitFromSignal(Signal, Info, Context); if (GCrashHandlerPointer) { GCrashHandlerPointer(CrashContext); } else { // call default one DefaultCrashHandler(CrashContext); } }