mirror of
				https://github.com/KartKrewDev/RingRacers.git
				synced 2025-10-30 08:01:28 +00:00 
			
		
		
		
	Add cpptrace in I_Error on windows, minidumps, stricter warnings, optimized drawers in debug
This commit is contained in:
		
							parent
							
								
									c1b22c0c73
								
							
						
					
					
						commit
						94ef03dcd2
					
				
					 11 changed files with 294 additions and 99 deletions
				
			
		|  | @ -125,6 +125,9 @@ find_package(PNG REQUIRED) | |||
| find_package(SDL2 CONFIG REQUIRED) | ||||
| find_package(CURL REQUIRED) | ||||
| find_package(Opus REQUIRED) | ||||
| if(WIN32 AND NOT MINGW) | ||||
| 	find_package(cpptrace CONFIG REQUIRED) | ||||
| endif() | ||||
| # Use the one in thirdparty/fmt to guarantee a minimum version | ||||
| #find_package(FMT CONFIG REQUIRED) | ||||
| 
 | ||||
|  |  | |||
|  | @ -54,8 +54,8 @@ | |||
| 			"name": "__develop-cl", | ||||
| 			"hidden": true, | ||||
| 			"cacheVariables": { | ||||
| 				"CMAKE_C_FLAGS_RELWITHDEBINFO": "/MD /O2 /Ob2 /DNDEBUG", | ||||
| 				"CMAKE_CXX_FLAGS_RELWITHDEBINFO": "/MD /O2 /Ob2 /DNDEBUG", | ||||
| 				"CMAKE_C_FLAGS_RELWITHDEBINFO": "/MD /Zi /O2 /Ob2 /DNDEBUG", | ||||
| 				"CMAKE_CXX_FLAGS_RELWITHDEBINFO": "/MD /Zi /O2 /Ob2 /DNDEBUG", | ||||
| 				"SRB2_CONFIG_DEV_BUILD": "ON", | ||||
| 				"CMAKE_BUILD_TYPE": "RelWithDebInfo" | ||||
| 			} | ||||
|  | @ -64,8 +64,8 @@ | |||
| 			"name": "__release-cl", | ||||
| 			"hidden": true, | ||||
| 			"cacheVariables": { | ||||
| 				"CMAKE_C_FLAGS_RELWITHDEBINFO": "/MD /O2 /Ob2 /DNDEBUG", | ||||
| 				"CMAKE_CXX_FLAGS_RELWITHDEBINFO": "/MD /O2 /Ob2 /DNDEBUG", | ||||
| 				"CMAKE_C_FLAGS_RELWITHDEBINFO": "/MD /Zi /O2 /Ob2 /DNDEBUG", | ||||
| 				"CMAKE_CXX_FLAGS_RELWITHDEBINFO": "/MD /Zi /O2 /Ob2 /DNDEBUG", | ||||
| 				"SRB2_CONFIG_DEV_BUILD": "OFF", | ||||
| 				"CMAKE_BUILD_TYPE": "RelWithDebInfo" | ||||
| 			} | ||||
|  |  | |||
|  | @ -176,6 +176,41 @@ add_executable(SRB2SDL2 MACOSX_BUNDLE WIN32 | |||
| 	p_deepcopy.cpp | ||||
| ) | ||||
| 
 | ||||
| # Always compile some files with optimizations in Debug config. | ||||
| # This is to make the debugging experience less slow for the majority of cases. | ||||
| set(always_optimize_options "") | ||||
| if(MSVC) | ||||
| 	set(always_optimize_options "$<$<CONFIG:Debug>:/O2;/Ob2>") | ||||
| else() | ||||
| 	set(always_optimize_options "$<$<CONFIG:Debug>:-O3>") | ||||
| endif() | ||||
| set_source_files_properties( | ||||
| 	r_bsp.cpp | ||||
| 	r_data.c | ||||
| 	r_debug.cpp | ||||
| 	r_debug_parser.cpp | ||||
| 	r_debug_printer.cpp | ||||
| 	r_draw.cpp | ||||
| 	r_fps.cpp | ||||
| 	r_main.cpp | ||||
| 	r_plane.cpp | ||||
| 	r_segs.cpp | ||||
| 	r_skins.c | ||||
| 	r_sky.c | ||||
| 	r_splats.c | ||||
| 	r_spritefx.cpp | ||||
| 	r_things.cpp | ||||
| 	r_bbox.c | ||||
| 	r_textures.cpp | ||||
| 	r_textures_dups.cpp | ||||
| 	r_patch.cpp | ||||
| 	r_patchrotation.c | ||||
| 	r_picformats.c | ||||
| 	r_portal.c | ||||
| 	PROPERTIES | ||||
| 	COMPILE_OPTIONS "${always_optimize_options}" | ||||
| ) | ||||
| 
 | ||||
| set_target_properties(SRB2SDL2 PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/sdl/macosx/MacOSXBundleInfo.plist.in") | ||||
| 
 | ||||
| if(SRB2_CONFIG_ENABLE_WEBM_MOVIES) | ||||
|  | @ -210,7 +245,7 @@ add_custom_target(_SRB2_reconf ALL | |||
| ) | ||||
| add_dependencies(SRB2SDL2 _SRB2_reconf) | ||||
| 
 | ||||
| if(("${CMAKE_COMPILER_IS_GNUCC}" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND "${CMAKE_SYSTEM_NAME}" MATCHES "Windows") | ||||
| if(("${CMAKE_COMPILER_IS_GNUCC}") AND "${CMAKE_SYSTEM_NAME}" MATCHES "Windows") | ||||
| 	target_link_options(SRB2SDL2 PRIVATE "-Wl,--disable-dynamicbase") | ||||
| 	if("${SRB2_CONFIG_STATIC_STDLIB}") | ||||
| 		# On MinGW with internal libraries, link the standard library statically | ||||
|  | @ -224,8 +259,19 @@ if(("${CMAKE_COMPILER_IS_GNUCC}" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND | |||
| 	endif() | ||||
| endif() | ||||
| 
 | ||||
| if(MSVC OR CMAKE_CXX_LINK_EXECUTABLE MATCHES "lld-link.exe") | ||||
| if(MSVC OR CMAKE_CXX_LINK_EXECUTABLE MATCHES "lld-link\\.exe") | ||||
| 	target_link_options(SRB2SDL2 PRIVATE /MANIFEST:NO) | ||||
| 	target_link_libraries(SRB2SDL2 PRIVATE "dbghelp") | ||||
| 
 | ||||
| endif() | ||||
| 
 | ||||
| if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND MSVC) | ||||
| 	# Stuff to make paths not include the builder's file system paths on clang-cl | ||||
| 	string(REPLACE "/" "\\" backslashes_cmake_source_dir "${CMAKE_SOURCE_DIR}") | ||||
| 	target_compile_options(SRB2SDL2 PRIVATE "$<$<CONFIG:RelWithDebInfo,Release>:/clang:-fdebug-prefix-map=${CMAKE_SOURCE_DIR}=X:/ringracers>") | ||||
| 	target_compile_options(SRB2SDL2 PRIVATE "$<$<CONFIG:RelWithDebInfo,Release>:/clang:-fdebug-prefix-map=${backslashes_cmake_source_dir}=X:/ringracers>") | ||||
| 	target_compile_options(SRB2SDL2 PRIVATE "$<$<CONFIG:RelWithDebInfo,Release>:/clang:-fdebug-compilation-dir=${CMAKE_SOURCE_DIR}>") | ||||
| 	target_link_options(SRB2SDL2 PRIVATE "$<$<CONFIG:RelWithDebInfo,Release>:/pdbaltpath:%_PDB%>") | ||||
| endif() | ||||
| 
 | ||||
| target_compile_features(SRB2SDL2 PRIVATE c_std_11 cxx_std_17) | ||||
|  | @ -283,6 +329,10 @@ target_link_libraries(SRB2SDL2 PRIVATE ZLIB::ZLIB) | |||
| target_link_libraries(SRB2SDL2 PRIVATE PNG::PNG) | ||||
| target_link_libraries(SRB2SDL2 PRIVATE CURL::libcurl) | ||||
| target_link_libraries(SRB2SDL2 PRIVATE Opus::opus) | ||||
| if(WIN32 AND NOT MINGW) | ||||
| 	target_link_libraries(SRB2SDL2 PRIVATE cpptrace::cpptrace) | ||||
| 	target_compile_definitions(SRB2SDL2 PRIVATE HAVE_CPPTRACE) | ||||
| endif() | ||||
| target_link_libraries(SRB2SDL2 PRIVATE ReNameNoise::renamenoise) | ||||
| if("${CMAKE_SYSTEM_NAME}" MATCHES "FreeBSD") | ||||
| 	target_link_libraries(SRB2SDL2 PRIVATE -lexecinfo) | ||||
|  | @ -461,6 +511,7 @@ target_compile_options(SRB2SDL2 PRIVATE | |||
| 	# This is a direct translation from versions.mk | ||||
| 	$<$<AND:$<COMPILE_LANGUAGE:C>,$<C_COMPILER_ID:GNU>>: | ||||
| 		-Wall | ||||
| 		-Werror-implicit-function-declaration | ||||
| 		-Wno-trigraphs | ||||
| 		-W # Was controlled by RELAXWARNINGS | ||||
| 		-pedantic | ||||
|  | @ -545,6 +596,7 @@ target_compile_options(SRB2SDL2 PRIVATE | |||
| 	$<$<AND:$<COMPILE_LANGUAGE:C>,$<OR:$<C_COMPILER_ID:AppleClang>,$<C_COMPILER_ID:Clang>>>: | ||||
| 		#-Wall | ||||
| 		-Werror=microsoft | ||||
| 		-Werror=implicit-function-declaration | ||||
| 		-Wreturn-type # Missing returns in non-void function | ||||
| 		-Wduplicate-decl-specifier | ||||
| 		-Wsometimes-uninitialized | ||||
|  | @ -570,9 +622,14 @@ target_compile_options(SRB2SDL2 PRIVATE | |||
| 	# C++, GNU | ||||
| 	$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:GNU>>: | ||||
| 		-Wall | ||||
| 		-Wno-c++98-compat | ||||
| 		-Wno-c++11-compat | ||||
| 		-Wno-c++14-compat # No C++14 compat needed | ||||
| 		-Werror=c++20-extensions | ||||
| 		-Werror=c++23-extensions # Disallow newer language features entirely | ||||
| 	> | ||||
| 
 | ||||
| 	# C++, GNU, Clang and Apple Clang | ||||
| 	# C++, Clang and Apple Clang | ||||
| 	$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<OR:$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:Clang>>>: | ||||
| 		#-Wall | ||||
| 		-Werror=microsoft | ||||
|  | @ -584,6 +641,8 @@ target_compile_options(SRB2SDL2 PRIVATE | |||
| 		-Wno-c++98-compat | ||||
| 		-Wno-c++11-compat | ||||
| 		-Wno-c++14-compat # No C++14 compat needed | ||||
| 		-Werror=c++20-extensions | ||||
| 		-Werror=c++23-extensions # Disallow newer language features entirely | ||||
| 		-Wno-unused-but-set-variable # Setting unread variables is fine (nontrivial C++ types issue) | ||||
| 		-Wno-misleading-indentation # Some cases in code currently | ||||
| 		-Wno-deprecated-non-prototype # We have no intention of using C23 yet. | ||||
|  | @ -594,6 +653,8 @@ target_compile_options(SRB2SDL2 PRIVATE | |||
| 		-Wno-unused-function | ||||
| 	> | ||||
| 
 | ||||
| 	# C++, Clang and Apple Clang | ||||
| 
 | ||||
| 	# C++, MSVC | ||||
| 	$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:MSVC>>: | ||||
| 		/Wv:19.20.27004.0 | ||||
|  |  | |||
|  | @ -457,7 +457,7 @@ enum { | |||
| 
 | ||||
| 
 | ||||
| */ | ||||
| void I_Error(const char *error, ...) FUNCIERROR; | ||||
| FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...); | ||||
| 
 | ||||
| /**	\brief	write a message to stderr (use before I_Quit) for when you need to quit with a msg, but need
 | ||||
|  the return code 0 of I_Quit(); | ||||
|  |  | |||
|  | @ -92,7 +92,7 @@ void I_OsPolling(void); | |||
| 
 | ||||
| /**	\brief Called by M_Responder when quit is selected, return exit code 0
 | ||||
| */ | ||||
| void I_Quit(void) FUNCNORETURN; | ||||
| FUNCNORETURN void ATTRNORETURN I_Quit(void); | ||||
| 
 | ||||
| typedef enum | ||||
| { | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ menuitem_t OPTIONS_Voice[] = | |||
| 		NULL, srb2::itemaction(&cv_voice_inputamp), 0, 0}, | ||||
| 
 | ||||
| 	{IT_STRING | IT_CVAR, "Input Noise Suppression", "Suppress background noise from your voice.", | ||||
| 		NULL, {.cvar = &cv_voice_denoise}, 0, 0}, | ||||
| 		NULL, srb2::itemaction(&cv_voice_denoise), 0, 0}, | ||||
| 
 | ||||
| 	{IT_STRING | IT_CVAR, "Input Sensitivity", "Voice higher than this threshold will transmit, in decibels.", | ||||
| 		NULL, srb2::itemaction(&cv_voice_activationthreshold), 0, 0 }, | ||||
|  |  | |||
|  | @ -11,6 +11,7 @@ | |||
| #include "../doomdef.h" | ||||
| #include "../doomstat.h" | ||||
| #include "../info.h" | ||||
| #include "../g_game.h" | ||||
| #include "../k_objects.h" | ||||
| #include "../p_local.h" | ||||
| #include "../r_state.h" | ||||
|  |  | |||
|  | @ -732,8 +732,7 @@ void R_RenderMaskedSegRange(drawseg_t *drawseg, INT32 x1, INT32 x2) | |||
| template <typename T> | ||||
| static constexpr T saturating_add(T x, T y) noexcept | ||||
| { | ||||
| 	INT64 z; | ||||
| 	z = static_cast<INT64>(x) + static_cast<INT64>(y); | ||||
| 	INT64 z = static_cast<INT64>(x) + static_cast<INT64>(y); | ||||
| 	if (z > static_cast<INT64>(std::numeric_limits<T>::max())) | ||||
| 	{ | ||||
| 		z = static_cast<INT64>(std::numeric_limits<T>::max()); | ||||
|  | @ -748,8 +747,7 @@ static constexpr T saturating_add(T x, T y) noexcept | |||
| template <typename T> | ||||
| static constexpr T saturating_mul(T x, T y) noexcept | ||||
| { | ||||
| 	INT64 z; | ||||
| 	z = static_cast<INT64>(x) * static_cast<INT64>(y); | ||||
| 	INT64 z = static_cast<INT64>(x) * static_cast<INT64>(y); | ||||
| 	if (z > static_cast<INT64>(std::numeric_limits<T>::max())) | ||||
| 	{ | ||||
| 		z = static_cast<INT64>(std::numeric_limits<T>::max()); | ||||
|  |  | |||
|  | @ -20,7 +20,6 @@ | |||
| #include "../core/string.h" | ||||
| 
 | ||||
| #include <exception> | ||||
| #include <stdexcept> | ||||
| 
 | ||||
| #include <tracy/tracy/Tracy.hpp> | ||||
| 
 | ||||
|  | @ -32,11 +31,7 @@ | |||
| #include <errno.h> | ||||
| #endif | ||||
| 
 | ||||
| extern "C" { | ||||
| #include "time.h" // For log timestamps
 | ||||
| } | ||||
| 
 | ||||
| #ifdef HAVE_SDL | ||||
| 
 | ||||
| #ifdef HAVE_TTF | ||||
| #include "SDL.h" | ||||
|  | @ -68,46 +63,6 @@ char logfilename[1024]; | |||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if defined (_WIN32) | ||||
| extern "C" { | ||||
| #include "../win32/win_dbg.h" | ||||
| } | ||||
| typedef BOOL (WINAPI *p_IsDebuggerPresent)(VOID); | ||||
| #endif | ||||
| 
 | ||||
| #if defined (_WIN32) | ||||
| static inline VOID MakeCodeWritable(VOID) | ||||
| { | ||||
| #ifdef USEASM // Disable write-protection of code segment
 | ||||
| 	DWORD OldRights; | ||||
| 	const DWORD NewRights = PAGE_EXECUTE_READWRITE; | ||||
| 	PBYTE pBaseOfImage = (PBYTE)GetModuleHandle(NULL); | ||||
| 	PIMAGE_DOS_HEADER dosH =(PIMAGE_DOS_HEADER)pBaseOfImage; | ||||
| 	PIMAGE_NT_HEADERS ntH = (PIMAGE_NT_HEADERS)(pBaseOfImage + dosH->e_lfanew); | ||||
| 	PIMAGE_OPTIONAL_HEADER oH = (PIMAGE_OPTIONAL_HEADER) | ||||
| 		((PBYTE)ntH + sizeof (IMAGE_NT_SIGNATURE) + sizeof (IMAGE_FILE_HEADER)); | ||||
| 	LPVOID pA = pBaseOfImage+oH->BaseOfCode; | ||||
| 	SIZE_T pS = oH->SizeOfCode; | ||||
| #if 1 // try to find the text section
 | ||||
| 	PIMAGE_SECTION_HEADER ntS = IMAGE_FIRST_SECTION (ntH); | ||||
| 	WORD s; | ||||
| 	for (s = 0; s < ntH->FileHeader.NumberOfSections; s++) | ||||
| 	{ | ||||
| 		if (memcmp (ntS[s].Name, ".text\0\0", 8) == 0) | ||||
| 		{ | ||||
| 			pA = pBaseOfImage+ntS[s].VirtualAddress; | ||||
| 			pS = ntS[s].Misc.VirtualSize; | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| 	if (!VirtualProtect(pA,pS,NewRights,&OldRights)) | ||||
| 		I_Error("Could not make code writable\n"); | ||||
| #endif | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef LOGMESSAGES | ||||
| static void InitLogging(void) | ||||
| { | ||||
|  | @ -212,10 +167,6 @@ static void init_exchndl() | |||
| 	if (pfnExcHndlInit != NULL) | ||||
| 		(pfnExcHndlInit)(); | ||||
| } | ||||
| #else | ||||
| static void init_exchndl() | ||||
| { | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef _WIN32 | ||||
|  | @ -300,25 +251,12 @@ int main(int argc, char **argv) | |||
| 
 | ||||
| 	//I_OutputMsg("I_StartupSystem() ...\n");
 | ||||
| 	I_StartupSystem(); | ||||
| #if defined (_WIN32) | ||||
| 
 | ||||
| #if defined (_WIN32) && !defined(_MSC_VER) | ||||
| 	if (!M_CheckParm("-noexchndl")) | ||||
| 	{ | ||||
| #if 0 // just load the DLL
 | ||||
| 		p_IsDebuggerPresent pfnIsDebuggerPresent = (p_IsDebuggerPresent)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsDebuggerPresent"); | ||||
| 		if ((!pfnIsDebuggerPresent || !pfnIsDebuggerPresent()) | ||||
| #ifdef BUGTRAP | ||||
| 			&& !InitBugTrap() | ||||
| #endif | ||||
| 			) | ||||
| #endif | ||||
| 	{ | ||||
| 		init_exchndl(); | ||||
| 	} | ||||
| 	} | ||||
| #ifndef __MINGW32__ | ||||
| 	prevExceptionFilter = SetUnhandledExceptionFilter(RecordExceptionInfo); | ||||
| #endif | ||||
| 	MakeCodeWritable(); | ||||
| #endif | ||||
| 
 | ||||
| 	try { | ||||
|  | @ -353,8 +291,6 @@ int main(int argc, char **argv) | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #ifdef _MSC_VER | ||||
| int WINAPI WinMain(HINSTANCE pInstance, HINSTANCE pPrevInstance, LPSTR lpCmdLine, int nShowCmd) | ||||
| { | ||||
|  |  | |||
|  | @ -39,6 +39,12 @@ typedef DWORD (WINAPI *p_timeGetTime) (void); | |||
| typedef UINT (WINAPI *p_timeEndPeriod) (UINT); | ||||
| typedef HANDLE (WINAPI *p_OpenFileMappingA) (DWORD, BOOL, LPCSTR); | ||||
| typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T); | ||||
| 
 | ||||
| #if defined(_WIN32) && !defined(__GNUC__) | ||||
| #define USE_DBGHELP | ||||
| #include <DbgHelp.h> | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
|  | @ -141,6 +147,10 @@ typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T); | |||
| #define UNIXBACKTRACE | ||||
| #endif | ||||
| 
 | ||||
| #ifdef HAVE_CPPTRACE | ||||
| #include <cpptrace/cpptrace.hpp> | ||||
| #endif | ||||
| 
 | ||||
| // Locations for searching for bios.pk3
 | ||||
| #if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON) | ||||
| #define DEFAULTWADLOCATION1 "/usr/local/share/games/RingRacers" | ||||
|  | @ -302,8 +312,10 @@ static void I_ShowErrorMessageBox(const char *messagefordevelopers, boolean dump | |||
| 		dumpmade ? | ||||
| #if defined (UNIXBACKTRACE) | ||||
| 			"crash-log.txt" | ||||
| #elif defined (_WIN32) | ||||
| #elif defined (_WIN32) && defined(__GNUC__) | ||||
| 			".rpt crash dump" | ||||
| #elif defined (USE_DBGHELP) | ||||
| 			".dmp crash dump" | ||||
| #endif | ||||
| 			" (very important!) and " : "", | ||||
| #ifdef LOGMESSAGES | ||||
|  | @ -369,12 +381,83 @@ static void I_ShowErrorMessageBox(const char *messagefordevelopers, boolean dump | |||
| 	// in case the fullscreen window blocks it for some absurd reason.
 | ||||
| } | ||||
| 
 | ||||
| static void I_ReportSignal(int num, int coredumped) | ||||
| static void I_ReportSignal(int num, int coredumped, void* tracefromcpptrace) | ||||
| { | ||||
| 	//static char msg[] = "oh no! back to reality!\r\n";
 | ||||
| 	const char *      sigmsg; | ||||
| 	char msg[128]; | ||||
| 	char msg[8192]; | ||||
| 
 | ||||
| #ifdef USE_DBGHELP | ||||
| 	// The signal code is a WIN32 exception code, not a libc signal
 | ||||
| 	// https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-exception_record
 | ||||
| 	switch (num) | ||||
| 	{ | ||||
| 	case EXCEPTION_ACCESS_VIOLATION: | ||||
| 		sigmsg = "EXCEPTION_ACCESS_VIOLATION"; | ||||
| 		break; | ||||
| 	case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: | ||||
| 		sigmsg = "EXCEPTION_ARRAY_BOUNDS_EXCEEDED"; | ||||
| 		break; | ||||
| 	case EXCEPTION_BREAKPOINT: | ||||
| 		sigmsg = "EXCEPTION_BREAKPOINT"; | ||||
| 		break; | ||||
| 	case EXCEPTION_DATATYPE_MISALIGNMENT: | ||||
| 		sigmsg = "EXCEPTION_DATATYPE_MISALIGNMENT"; | ||||
| 		break; | ||||
| 	case EXCEPTION_FLT_DENORMAL_OPERAND: | ||||
| 		sigmsg = "EXCEPTION_FLT_DENORMAL_OPERAND"; | ||||
| 		break; | ||||
| 	case EXCEPTION_FLT_DIVIDE_BY_ZERO: | ||||
| 		sigmsg = "EXCEPTION_FLT_DENORMAL_OPERAND"; | ||||
| 		break; | ||||
| 	case EXCEPTION_FLT_INEXACT_RESULT: | ||||
| 		sigmsg = "EXCEPTION_FLT_INEXACT_RESULT"; | ||||
| 		break; | ||||
| 	case EXCEPTION_FLT_INVALID_OPERATION: | ||||
| 		sigmsg = "EXCEPTION_FLT_INVALID_OPERATION"; | ||||
| 		break; | ||||
| 	case EXCEPTION_FLT_OVERFLOW: | ||||
| 		sigmsg = "EXCEPTION_FLT_OVERFLOW"; | ||||
| 		break; | ||||
| 	case EXCEPTION_FLT_STACK_CHECK: | ||||
| 		sigmsg = "EXCEPTION_FLT_STACK_CHECK"; | ||||
| 		break; | ||||
| 	case EXCEPTION_FLT_UNDERFLOW: | ||||
| 		sigmsg = "EXCEPTION_FLT_UNDERFLOW"; | ||||
| 		break; | ||||
| 	case EXCEPTION_ILLEGAL_INSTRUCTION: | ||||
| 		sigmsg = "EXCEPTION_ILLEGAL_INSTRUCTION"; | ||||
| 		break; | ||||
| 	case EXCEPTION_IN_PAGE_ERROR: | ||||
| 		sigmsg = "EXCEPTION_IN_PAGE_ERROR"; | ||||
| 		break; | ||||
| 	case EXCEPTION_INT_DIVIDE_BY_ZERO: | ||||
| 		sigmsg = "EXCEPTION_INT_DIVIDE_BY_ZERO"; | ||||
| 		break; | ||||
| 	case EXCEPTION_INT_OVERFLOW: | ||||
| 		sigmsg = "EXCEPTION_INT_OVERFLOW"; | ||||
| 		break; | ||||
| 	case EXCEPTION_INVALID_DISPOSITION: | ||||
| 		sigmsg = "EXCEPTION_INVALID_DISPOSITION"; | ||||
| 		break; | ||||
| 	case EXCEPTION_NONCONTINUABLE_EXCEPTION: | ||||
| 		sigmsg = "EXCEPTION_NONCONTINUABLE_EXCEPTION"; | ||||
| 		break; | ||||
| 	case EXCEPTION_PRIV_INSTRUCTION: | ||||
| 		sigmsg = "EXCEPTION_PRIV_INSTRUCTION"; | ||||
| 		break; | ||||
| 	case EXCEPTION_SINGLE_STEP: | ||||
| 		sigmsg = "EXCEPTION_SINGLE_STEP"; | ||||
| 		break; | ||||
| 	case EXCEPTION_STACK_OVERFLOW: | ||||
| 		sigmsg = "EXCEPTION_STACK_OVERFLOW"; | ||||
| 		break; | ||||
| 	default: | ||||
| 		sigmsg = ""; | ||||
| 		sprintf(msg, "unknown exception %d", num); | ||||
| 		break; | ||||
| 	} | ||||
| #else | ||||
| 	switch (num) | ||||
| 	{ | ||||
| //	case SIGINT:
 | ||||
|  | @ -405,30 +488,132 @@ static void I_ReportSignal(int num, int coredumped) | |||
| 		else | ||||
| 			sigmsg = msg; | ||||
| 	} | ||||
| #endif | ||||
| 	if (sigmsg) | ||||
| 	{ | ||||
| 		strcpy(msg, sigmsg); | ||||
| 	} | ||||
| 
 | ||||
| 	if (coredumped) | ||||
| 	{ | ||||
| 		if (sigmsg) | ||||
| 			strcpy(msg, sigmsg); | ||||
| 		strcat(msg, " (core dumped)"); | ||||
| 	} | ||||
| 
 | ||||
| #ifdef HAVE_CPPTRACE | ||||
| 	strncat(msg, "\n", sizeof(msg) - strlen(msg) - 1); | ||||
| 
 | ||||
| 	cpptrace::stacktrace const& trace = *(cpptrace::stacktrace*)tracefromcpptrace; | ||||
| 	bool firstfound = false; | ||||
| #ifndef _WIN32 | ||||
| 	firstfound = true; | ||||
| #endif | ||||
| 	for (const auto& frame : trace) | ||||
| 	{ | ||||
| #ifdef _WIN32 | ||||
| 		// dumb hack, unsure if it works on anything other than windows 10-11
 | ||||
| 		if (!firstfound && frame.symbol == "KiUserExceptionDispatcher") | ||||
| 		{ | ||||
| 			firstfound = true; | ||||
| 			continue; | ||||
| 		} | ||||
| 		if (!firstfound) | ||||
| 		{ | ||||
| 			continue; | ||||
| 		} | ||||
| #endif | ||||
| 
 | ||||
| 		srb2::String frame_str; | ||||
| 		if (!frame.filename.empty() && frame.line.has_value()) | ||||
| 		{ | ||||
| 			frame_str = srb2::format("{} at {}:{}\n", frame.symbol, frame.filename, frame.line.value_or(0)); | ||||
| 		} | ||||
| 		else if (!frame.filename.empty() && !frame.line.has_value()) | ||||
| 		{ | ||||
| 			frame_str = srb2::format("{} at {}\n", frame.symbol, frame.filename); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			frame_str = srb2::format("{}\n", frame.symbol); | ||||
| 		} | ||||
| 
 | ||||
| 		strncat(msg, frame_str.c_str(), sizeof(msg) - strlen(msg) - 1); | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| 	sigmsg = msg; | ||||
| 	} | ||||
| 
 | ||||
| 	I_OutputMsg("\nProcess killed by signal: %s\n\n", sigmsg); | ||||
| 
 | ||||
| 	I_ShowErrorMessageBox(sigmsg, | ||||
| #if defined (UNIXBACKTRACE) | ||||
| 		true | ||||
| #elif defined (_WIN32) | ||||
| #elif defined (_WIN32) && defined (__GNUC__) | ||||
| 		!M_CheckParm("-noexchndl") | ||||
| #elif defined (USE_DBGHELP) | ||||
| 		true | ||||
| #else | ||||
| 		false | ||||
| #endif | ||||
| 	); | ||||
| } | ||||
| 
 | ||||
| #ifndef NEWSIGNALHANDLER | ||||
| #if !defined(NEWSIGNALHANDLER) || defined(USE_DBGHELP) | ||||
| static void CommonSignalHandleCleanup(void) | ||||
| { | ||||
| 	D_QuitNetGame(); // Fix server freezes
 | ||||
| 	CL_AbortDownloadResume(); | ||||
| 	G_DirtyGameData(); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef USE_DBGHELP | ||||
| LPTOP_LEVEL_EXCEPTION_FILTER g_previous_toplevelexceptionfilter; | ||||
| 
 | ||||
| static LONG WriteMinidumpExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo) | ||||
| { | ||||
| #ifdef HAVE_CPPTRACE | ||||
| 	// Fully aware this is completely signal unsafe. We don't ever try to recover from signals, so who cares.
 | ||||
| 	// If it breaks it breaks. We're not mission critical software.
 | ||||
| 	cpptrace::stacktrace trace = cpptrace::generate_trace(0, 30); | ||||
| #else | ||||
| 	int trace = 0; | ||||
| #endif | ||||
| 
 | ||||
| 	MINIDUMP_EXCEPTION_INFORMATION mei {}; | ||||
| 	mei.ExceptionPointers = ExceptionInfo; | ||||
| 	mei.ClientPointers = TRUE; | ||||
| 	mei.ThreadId = GetCurrentThreadId(); | ||||
| 	HANDLE outfile; | ||||
| 
 | ||||
| 	char outfilename[1024]; | ||||
| 	GetModuleFileNameA(NULL, outfilename, sizeof(outfilename)); | ||||
| 	strncat(outfilename, ".dmp", sizeof(outfilename) - strlen(outfilename) - 1); | ||||
| 
 | ||||
| 	outfile = CreateFileA(outfilename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); | ||||
| 	if (outfile == NULL) | ||||
| 	{ | ||||
| 		return EXCEPTION_CONTINUE_SEARCH; | ||||
| 	} | ||||
| 
 | ||||
| 	BOOL result; | ||||
| 	result = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), outfile, MiniDumpNormal, &mei, NULL, NULL); | ||||
| 	if (result == FALSE) | ||||
| 	{ | ||||
| 		CloseHandle(outfile); | ||||
| 		DeleteFileA("ringracers_minidump.dmp"); | ||||
| 		goto exit; | ||||
| 	} | ||||
| 
 | ||||
| 	CloseHandle(outfile); | ||||
| 
 | ||||
| exit: | ||||
| 	CommonSignalHandleCleanup(); | ||||
| 	I_ReportSignal(ExceptionInfo->ExceptionRecord->ExceptionCode, 0, (void*)&trace); | ||||
| 	return EXCEPTION_CONTINUE_SEARCH; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #if !defined(NEWSIGNALHANDLER) && !defined(USE_DBGHELP) | ||||
| static ATTRNORETURN void signal_handler(INT32 num) | ||||
| { | ||||
| 	g_in_exiting_signal_handler = true; | ||||
|  | @ -441,18 +626,20 @@ static ATTRNORETURN void signal_handler(INT32 num) | |||
| 		exit(-2); | ||||
| 	} | ||||
| 
 | ||||
| 	D_QuitNetGame(); // Fix server freezes
 | ||||
| 	CL_AbortDownloadResume(); | ||||
| 	G_DirtyGameData(); | ||||
| 	CommonSignalHandleCleanup(); | ||||
| #ifdef UNIXBACKTRACE | ||||
| 	write_backtrace(num); | ||||
| #endif | ||||
| 	I_ReportSignal(num, 0); | ||||
| 	I_ReportSignal(num, 0, NULL); | ||||
| 	signal(num, SIG_DFL);               //default signal action
 | ||||
| 	raise(num); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef USE_DBGHELP | ||||
| LPTOP_LEVEL_EXCEPTION_FILTER g_prevtoplevelexceptionfilter; | ||||
| #endif | ||||
| 
 | ||||
| FUNCNORETURN static ATTRNORETURN void quit_handler(int num) | ||||
| { | ||||
| 	signal(num, SIG_DFL); //default signal action
 | ||||
|  | @ -829,12 +1016,17 @@ static void I_RegisterSignals (void) | |||
| 
 | ||||
| 	// If these defines don't exist,
 | ||||
| 	// then compilation would have failed above us...
 | ||||
| #ifndef NEWSIGNALHANDLER | ||||
| #if !defined(NEWSIGNALHANDLER) && !defined(USE_DBGHELP) | ||||
| 	signal(SIGILL , signal_handler); | ||||
| 	signal(SIGSEGV , signal_handler); | ||||
| 	signal(SIGABRT , signal_handler); | ||||
| 	signal(SIGFPE , signal_handler); | ||||
| #endif | ||||
| 
 | ||||
| #ifdef USE_DBGHELP | ||||
| 	// Initialize Windows SDK-specific crashdump handler (DbgHelp)
 | ||||
| 	g_previous_toplevelexceptionfilter = SetUnhandledExceptionFilter(WriteMinidumpExceptionFilter); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| #ifdef NEWSIGNALHANDLER | ||||
|  | @ -1598,9 +1790,9 @@ static void I_Fork(void) | |||
| 				{ | ||||
| 					signum = WTERMSIG (status); | ||||
| #ifdef WCOREDUMP | ||||
| 					I_ReportSignal(signum, WCOREDUMP (status)); | ||||
| 					I_ReportSignal(signum, WCOREDUMP (status), NULL); | ||||
| #else | ||||
| 					I_ReportSignal(signum, 0); | ||||
| 					I_ReportSignal(signum, 0, NULL); | ||||
| #endif | ||||
| 					status = 128 + signum; | ||||
| 				} | ||||
|  | @ -1656,7 +1848,7 @@ INT32 I_StartupSystem(void) | |||
| //
 | ||||
| // I_Quit
 | ||||
| //
 | ||||
| void I_Quit(void) | ||||
| FUNCNORETURN void ATTRNORETURN I_Quit(void) | ||||
| { | ||||
| 	static SDL_bool quiting = SDL_FALSE; | ||||
| 
 | ||||
|  | @ -1732,7 +1924,7 @@ static boolean shutdowning = false; | |||
| 
 | ||||
| extern "C" consvar_t cv_fuzz; | ||||
| 
 | ||||
| void I_Error(const char *error, ...) | ||||
| FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...) | ||||
| { | ||||
| 	va_list argptr; | ||||
| 	char buffer[8192]; | ||||
|  |  | |||
|  | @ -4,6 +4,10 @@ | |||
|   "version": "1.0.0", | ||||
|   "builtin-baseline": "d5ec528843d29e3a52d745a64b469f810b2cedbf", | ||||
|   "dependencies": [ | ||||
|     { | ||||
|       "name": "cpptrace", | ||||
|       "platform": "windows & !mingw" | ||||
|     }, | ||||
|     "curl", | ||||
|     "libogg", | ||||
|     "libpng", | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Eidolon
						Eidolon