All pastes #669396 Raw Edit

Debug EXE

public cpp v1 · immutable
#669396 ·published 2007-08-24 17:20 UTC
rendered paste body
SceneHandler *GELEngine = NULL;LONG WINAPI TopLevelFilter(struct _EXCEPTION_POINTERS *ExceptionInfo){	LONG rc = EXCEPTION_CONTINUE_SEARCH;	HMODULE DllHandle = NULL;	String DumpFileName;	String ErrorMessage;	MINIDUMPWRITEDUMP MiniDump;	HANDLE DumpFile;	char Str[MAX_PATH];	bool ReadyToReport = false;	if (GetModuleFileName(NULL, Str, MAX_PATH))	{		// Get the Absolute Path of the EXE and put the DumpFile.dmp there.		PathRemoveFileSpec(Str);		DumpFileName = Str;		DumpFileName.append("\\CrashReport.dmp");	}	// Load the Debug Help library to help us with a stack trace	DllHandle = LoadLibrary("DBGHELP.DLL");	if (DllHandle)	{		// Get the address of the MiniDumpWriteDump() function inside the library		MiniDump = (MINIDUMPWRITEDUMP) GetProcAddress(DllHandle, "MiniDumpWriteDump");		if (MiniDump)		{			// create the file			DumpFile = CreateFile(DumpFileName.c_str(), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);			if (DumpFile != INVALID_HANDLE_VALUE)			{				MINIDUMP_EXCEPTION_INFORMATION ExInfo;				ExInfo.ThreadId = GetCurrentThreadId();				ExInfo.ExceptionPointers = ExceptionInfo;				ExInfo.ClientPointers = NULL;				// Write the information into the dump				if (MiniDump(GetCurrentProcess(), GetCurrentProcessId(), DumpFile, MiniDumpNormal, &ExInfo, NULL, NULL))				{					ReadyToReport = true;					rc = EXCEPTION_EXECUTE_HANDLER;				}else{					ErrorMessage = "Failed to save dump file to CrashReport.dmp.";				}								CloseHandle(DumpFile);				if (ReadyToReport)				{					// **********Report that a crash has happened**********				}			}else{				ErrorMessage = "Cannot create CrashReport.dmp. File I/O error!";			}		}else{			ErrorMessage = "Failed to attach to MiniDumpWriteDump(). DBGHELP.DLL might be too old?";		}	}else{		ErrorMessage = "DBGHELP.DLL not found.";	}	if (ErrorMessage.size() > 0)	{		MessageBox(NULL, ErrorMessage.c_str(), GEL_ENGINE_NAME, MB_OK);	}	return rc;}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){	#ifdef _DEBUG		_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF);	#endif	__try	{		// Attempt to create a Game Object		GELEngine = new SceneHandler(hInstance, hPrevInstance, lpCmdLine, nCmdShow);		// Run the Game		if (GELEngine)		{			GELEngine->Loop();			// Delete the Game Engine			SAFE_DELETE(GELEngine);		}	} __except(TopLevelFilter(GetExceptionInformation()))	{		// An Error has occurred, delete the objects in memory		if (GELEngine)		{			// Delete the Game Engine			SAFE_DELETE(GELEngine);		}		return 0;	}	#ifdef _DEBUG		if (_CrtDumpMemoryLeaks())		{			MessageBox(NULL, "Memory Leak Detected!", "Warning!", MB_OK);		}	#endif	return 0;}