// Windows glue int32 GuardedMainWrapper( int32 ArgC, ANSICHAR* ArgV[] ) { int32 ReturnCode = 0; #if !PLATFORM_MAC if (FPlatformMisc::IsDebuggerPresent()) #endif { ReturnCode = GuardedMain( ArgC, ArgV ); } #if !PLATFORM_MAC else { __try { GIsGuarded = 1; ReturnCode = GuardedMain( ArgC, ArgV ); GIsGuarded = 0; } __except( NullReportCrash( GetExceptionInformation() ) ) { } } #endif FEngineLoop::AppPreExit(); FEngineLoop::AppExit(); return ReturnCode; }
// Windows glue int32 GuardedMainWrapper(int32 ArgC, TCHAR* ArgV[]) { int32 ReturnCode = 0; if (FPlatformMisc::IsDebuggerPresent()) { ReturnCode = GuardedMain( ArgC, ArgV ); } else { __try { GIsGuarded = 1; ReturnCode = GuardedMain( ArgC, ArgV ); GIsGuarded = 0; } __except( SimpleCrashHandler( GetExceptionInformation() ) ) { } } FEngineLoop::AppPreExit(); FEngineLoop::AppExit(); return ReturnCode; }
/** * The inner exception handler catches crashes/asserts in native C++ code and is the only way to get the correct callstack * when running a 64-bit executable. However, XAudio2 doesn't like this and it may result in no sound. */ LAUNCH_API int32 GuardedMainWrapper( const TCHAR* CmdLine, HINSTANCE hInInstance, HINSTANCE hPrevInstance, int32 nCmdShow ) { int32 ErrorLevel = 0; if ( GEnableInnerException ) { #if !PLATFORM_SEH_EXCEPTIONS_DISABLED __try #endif { // Run the guarded code. ErrorLevel = GuardedMain( CmdLine, hInInstance, hPrevInstance, nCmdShow ); } #if !PLATFORM_SEH_EXCEPTIONS_DISABLED __except( ReportCrash( GetExceptionInformation() ), EXCEPTION_CONTINUE_SEARCH ) { } #endif } else {
int32 GuardedMainWrapper(int32 ArgC, TCHAR* ArgV[], const TCHAR* CrashOutputFile) { // We need to know whether we are using XGE now, in case an exception // is thrown before we parse the command line inside GuardedMain. GShaderCompileUseXGE = (ArgC > 6) && FCString::Strcmp(ArgV[6], TEXT("-xge")) == 0; int32 ReturnCode = 0; #if PLATFORM_WINDOWS if (FPlatformMisc::IsDebuggerPresent()) #endif { ReturnCode = GuardedMain(ArgC, ArgV); } #if PLATFORM_WINDOWS else { // Don't want 32 dialogs popping up when SCW fails GUseCrashReportClient = false; __try { GIsGuarded = 1; ReturnCode = GuardedMain(ArgC, ArgV); GIsGuarded = 0; } __except( ReportCrash( GetExceptionInformation() ) ) { FArchive& OutputFile = *IFileManager::Get().CreateFileWriter(CrashOutputFile,FILEWRITE_NoFail); int32 OutputVersion = ShaderCompileWorkerOutputVersion; OutputFile << OutputVersion; int32 ErrorCode = GFailedDueToShaderFormatVersion ? 2 : 1; OutputFile << ErrorCode; // Note: Can't use FStrings here as SEH can't be used with destructors int32 CallstackLength = FCString::Strlen(GErrorHist); OutputFile << CallstackLength; int32 ExceptionInfoLength = FCString::Strlen(GErrorExceptionDescription); OutputFile << ExceptionInfoLength; OutputFile.Serialize(GErrorHist, CallstackLength * sizeof(TCHAR)); OutputFile.Serialize(GErrorExceptionDescription, ExceptionInfoLength * sizeof(TCHAR)); int32 NumBatches = 0; OutputFile << NumBatches; // Close the output file. delete &OutputFile; if (GShaderCompileUseXGE) { ReturnCode = 1; WriteXGESuccessFile(ArgV[1]); } } } #endif FEngineLoop::AppPreExit(); FEngineLoop::AppExit(); return ReturnCode; }
__try #endif { // Run the guarded code. ErrorLevel = GuardedMain( CmdLine, hInInstance, hPrevInstance, nCmdShow ); } #if !PLATFORM_SEH_EXCEPTIONS_DISABLED __except( ReportCrash( GetExceptionInformation() ), EXCEPTION_CONTINUE_SEARCH ) { } #endif } else { // Run the guarded code. ErrorLevel = GuardedMain( CmdLine, hInInstance, hPrevInstance, nCmdShow ); } return ErrorLevel; } int32 WINAPI WinMain( HINSTANCE hInInstance, HINSTANCE hPrevInstance, char*, int32 nCmdShow ) { // Setup common Windows settings SetupWindowsEnvironment(); int32 ErrorLevel = 0; hInstance = hInInstance; const TCHAR* CmdLine = GetCommandLine(); #if !(UE_BUILD_SHIPPING && WITH_EDITOR)