示例#1
0
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);
	}
}