Include steam.inf in crash metadata
This commit is contained in:
		
							parent
							
								
									d2ad4eb071
								
							
						
					
					
						commit
						e4a0c190ab
					
				| @ -7,7 +7,7 @@ | |||||||
|  * This program is free software; you can redistribute it and/or modify it under |  * This program is free software; you can redistribute it and/or modify it under | ||||||
|  * the terms of the GNU General Public License, version 3.0, as published by the |  * the terms of the GNU General Public License, version 3.0, as published by the | ||||||
|  * Free Software Foundation. |  * Free Software Foundation. | ||||||
|  *  |  * | ||||||
|  * This program is distributed in the hope that it will be useful, but WITHOUT |  * This program is distributed in the hope that it will be useful, but WITHOUT | ||||||
|  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | ||||||
|  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more |  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more | ||||||
| @ -28,7 +28,7 @@ | |||||||
| #include "third_party/lss/linux_syscall_support.h" | #include "third_party/lss/linux_syscall_support.h" | ||||||
| 
 | 
 | ||||||
| #include <signal.h> | #include <signal.h> | ||||||
| #include <dirent.h>  | #include <dirent.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #elif defined _WINDOWS | #elif defined _WINDOWS | ||||||
| #define _STDINT // ~.~
 | #define _STDINT // ~.~
 | ||||||
| @ -54,6 +54,7 @@ char crashCommandLine[1024]; | |||||||
| char crashSourceModPath[512]; | char crashSourceModPath[512]; | ||||||
| char crashGameDirectory[256]; | char crashGameDirectory[256]; | ||||||
| char crashExtensionVersion[32]; | char crashExtensionVersion[32]; | ||||||
|  | char steamInf[512]; | ||||||
| 
 | 
 | ||||||
| char dumpStoragePath[512]; | char dumpStoragePath[512]; | ||||||
| char logPath[512]; | char logPath[512]; | ||||||
| @ -124,13 +125,16 @@ static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, | |||||||
| 	sys_write(extra, crashGameDirectory, my_strlen(crashGameDirectory)); | 	sys_write(extra, crashGameDirectory, my_strlen(crashGameDirectory)); | ||||||
| 	sys_write(extra, "\nExtensionVersion=", 18); | 	sys_write(extra, "\nExtensionVersion=", 18); | ||||||
| 	sys_write(extra, crashExtensionVersion, my_strlen(crashExtensionVersion)); | 	sys_write(extra, crashExtensionVersion, my_strlen(crashExtensionVersion)); | ||||||
|  | 	sys_write(extra, steamInf, my_strlen(steamInf)); | ||||||
| 	sys_write(extra, "\n-------- CONFIG END --------\n", 30); | 	sys_write(extra, "\n-------- CONFIG END --------\n", 30); | ||||||
| 
 | 
 | ||||||
| 	if (GetSpew) { | 	if (GetSpew) { | ||||||
| 		GetSpew(spewBuffer, sizeof(spewBuffer)); | 		GetSpew(spewBuffer, sizeof(spewBuffer)); | ||||||
|                 sys_write(extra, "-------- CONSOLE HISTORY BEGIN --------\n", 40); | 		if (my_strlen(spewBuffer) > 0) { | ||||||
| 		sys_write(extra, spewBuffer, my_strlen(spewBuffer)); | 			sys_write(extra, "-------- CONSOLE HISTORY BEGIN --------\n", 40); | ||||||
| 		sys_write(extra, "-------- CONSOLE HISTORY END --------\n", 38); | 			sys_write(extra, spewBuffer, my_strlen(spewBuffer)); | ||||||
|  | 			sys_write(extra, "-------- CONSOLE HISTORY END --------\n", 38); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| #if 0 | #if 0 | ||||||
| @ -201,7 +205,7 @@ void OnGameFrame(bool simulating) | |||||||
| 	for (int i = 0; i < kNumHandledSignals; ++i) { | 	for (int i = 0; i < kNumHandledSignals; ++i) { | ||||||
| 		sigaddset(&act.sa_mask, kExceptionSignals[i]); | 		sigaddset(&act.sa_mask, kExceptionSignals[i]); | ||||||
| 	} | 	} | ||||||
| 	 | 
 | ||||||
| 	act.sa_sigaction = SignalHandler; | 	act.sa_sigaction = SignalHandler; | ||||||
| 	act.sa_flags = SA_ONSTACK | SA_SIGINFO; | 	act.sa_flags = SA_ONSTACK | SA_SIGINFO; | ||||||
| 
 | 
 | ||||||
| @ -233,15 +237,15 @@ LONG CALLBACK BreakpadVectoredHandler(_In_ PEXCEPTION_POINTERS ExceptionInfo) | |||||||
| 		default: | 		default: | ||||||
| 			return EXCEPTION_CONTINUE_SEARCH; | 			return EXCEPTION_CONTINUE_SEARCH; | ||||||
| 	} | 	} | ||||||
| 	 | 
 | ||||||
| 	if (handler->WriteMinidumpForException(ExceptionInfo)) | 	if (handler->WriteMinidumpForException(ExceptionInfo)) | ||||||
| 	{ | 	{ | ||||||
| 		// Stop the handler thread from deadlocking us.
 | 		// Stop the handler thread from deadlocking us.
 | ||||||
| 		delete handler; | 		delete handler; | ||||||
| 		 | 
 | ||||||
| 		// Stop Valve's handler being called.
 | 		// Stop Valve's handler being called.
 | ||||||
| 		ExceptionInfo->ExceptionRecord->ExceptionCode = EXCEPTION_BREAKPOINT; | 		ExceptionInfo->ExceptionRecord->ExceptionCode = EXCEPTION_BREAKPOINT; | ||||||
| 		 | 
 | ||||||
| 		return EXCEPTION_EXECUTE_HANDLER; | 		return EXCEPTION_EXECUTE_HANDLER; | ||||||
| 	} else { | 	} else { | ||||||
| 		return EXCEPTION_CONTINUE_SEARCH; | 		return EXCEPTION_CONTINUE_SEARCH; | ||||||
| @ -270,12 +274,24 @@ static bool dumpCallback(const wchar_t* dump_path, | |||||||
| 		return succeeded; | 		return succeeded; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	fprintf(extra, "-------- CONFIG BEGIN --------"); | ||||||
|  | 	fprintf(extra, "\nMap=%s", crashMap); | ||||||
|  | 	fprintf(extra, "\nGamePath=%s", crashGamePath); | ||||||
|  | 	fprintf(extra, "\nCommandLine=%s", crashCommandLine); | ||||||
|  | 	fprintf(extra, "\nSourceModPath=%s", crashSourceModPath); | ||||||
|  | 	fprintf(extra, "\nGameDirectory=%s", crashGameDirectory); | ||||||
|  | 	fprintf(extra, "\nExtensionVersion=%s", crashExtensionVersion); | ||||||
|  | 	fprintf(extra, "%s", steamInf); | ||||||
|  | 	fprintf(extra, "\n-------- CONFIG END --------\n"); | ||||||
|  | 
 | ||||||
| 	if (GetSpew) { | 	if (GetSpew) { | ||||||
| 		GetSpew(spewBuffer, sizeof(spewBuffer)); | 		GetSpew(spewBuffer, sizeof(spewBuffer)); | ||||||
| 		fprintf(extra, "-------- CONSOLE HISTORY BEGIN --------\n%s-------- CONSOLE HISTORY END --------\n", spewBuffer); | 		if (strlen(spewBuffer) > 0) { | ||||||
|  | 			fprintf(extra, "-------- CONSOLE HISTORY BEGIN --------\n%s-------- CONSOLE HISTORY END --------\n", spewBuffer); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|         fclose(extra); |   fclose(extra); | ||||||
| 
 | 
 | ||||||
| 	return succeeded; | 	return succeeded; | ||||||
| } | } | ||||||
| @ -308,7 +324,7 @@ bool UploadAndDeleteCrashDump(const char *path, char *response, int maxlen) | |||||||
| 	const char *minidumpUrl = g_pSM->GetCoreConfigValue("MinidumpUrl"); | 	const char *minidumpUrl = g_pSM->GetCoreConfigValue("MinidumpUrl"); | ||||||
| 	if (!minidumpUrl) minidumpUrl = "http://crash.limetech.org/submit"; | 	if (!minidumpUrl) minidumpUrl = "http://crash.limetech.org/submit"; | ||||||
| 
 | 
 | ||||||
| 	bool uploaded = xfer->PostAndDownload(minidumpUrl, form, &data, NULL);	 | 	bool uploaded = xfer->PostAndDownload(minidumpUrl, form, &data, NULL); | ||||||
| 
 | 
 | ||||||
| 	if (response) { | 	if (response) { | ||||||
| 		if (uploaded) { | 		if (uploaded) { | ||||||
| @ -417,7 +433,7 @@ bool Accelerator::SDK_OnLoad(char *error, size_t maxlength, bool late) | |||||||
| 	if (!gameconfs->LoadGameConfigFile("accelerator.games", &gameconfig, gameconfigError, sizeof(gameconfigError))) { | 	if (!gameconfs->LoadGameConfigFile("accelerator.games", &gameconfig, gameconfigError, sizeof(gameconfigError))) { | ||||||
| 		smutils->LogError(myself, "WARNING: Failed to load gamedata file, console output and command line will not be included in crash reports: %s", gameconfigError); | 		smutils->LogError(myself, "WARNING: Failed to load gamedata file, console output and command line will not be included in crash reports: %s", gameconfigError); | ||||||
| 	} else if (!gameconfig->GetMemSig("GetSpew", (void **)&GetSpew)) { | 	} else if (!gameconfig->GetMemSig("GetSpew", (void **)&GetSpew)) { | ||||||
| 		smutils->LogError(myself, "WARNING: GetSpew not found in gamedata, console output will not be included in crash reports."); | 		smutils->LogMessage(myself, "WARNING: GetSpew not found in gamedata, console output will not be included in crash reports."); | ||||||
| 	} else if (!GetSpew) { | 	} else if (!GetSpew) { | ||||||
| 		smutils->LogError(myself, "WARNING: Sigscan for GetSpew failed, console output will not be included in crash reports."); | 		smutils->LogError(myself, "WARNING: Sigscan for GetSpew failed, console output will not be included in crash reports."); | ||||||
| 	} | 	} | ||||||
| @ -429,7 +445,7 @@ bool Accelerator::SDK_OnLoad(char *error, size_t maxlength, bool late) | |||||||
| 	struct sigaction oact; | 	struct sigaction oact; | ||||||
| 	sigaction(SIGSEGV, NULL, &oact); | 	sigaction(SIGSEGV, NULL, &oact); | ||||||
| 	SignalHandler = oact.sa_sigaction; | 	SignalHandler = oact.sa_sigaction; | ||||||
| 	 | 
 | ||||||
| 	g_pSM->AddGameFrameHook(OnGameFrame); | 	g_pSM->AddGameFrameHook(OnGameFrame); | ||||||
| #elif defined _WINDOWS | #elif defined _WINDOWS | ||||||
| 	wchar_t *buf = new wchar_t[sizeof(dumpStoragePath)]; | 	wchar_t *buf = new wchar_t[sizeof(dumpStoragePath)]; | ||||||
| @ -438,7 +454,7 @@ bool Accelerator::SDK_OnLoad(char *error, size_t maxlength, bool late) | |||||||
| 	handler = new google_breakpad::ExceptionHandler(std::wstring(buf, num_chars), NULL, dumpCallback, NULL, google_breakpad::ExceptionHandler::HANDLER_ALL); | 	handler = new google_breakpad::ExceptionHandler(std::wstring(buf, num_chars), NULL, dumpCallback, NULL, google_breakpad::ExceptionHandler::HANDLER_ALL); | ||||||
| 
 | 
 | ||||||
| 	vectoredHandler = AddVectoredExceptionHandler(0, BreakpadVectoredHandler); | 	vectoredHandler = AddVectoredExceptionHandler(0, BreakpadVectoredHandler); | ||||||
| 	 | 
 | ||||||
| 	delete buf; | 	delete buf; | ||||||
| #else | #else | ||||||
| #error Bad platform. | #error Bad platform. | ||||||
| @ -474,7 +490,7 @@ bool Accelerator::SDK_OnLoad(char *error, size_t maxlength, bool late) | |||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Accelerator::SDK_OnUnload()  | void Accelerator::SDK_OnUnload() | ||||||
| { | { | ||||||
| #if defined _LINUX | #if defined _LINUX | ||||||
| 	g_pSM->RemoveGameFrameHook(OnGameFrame); | 	g_pSM->RemoveGameFrameHook(OnGameFrame); | ||||||
| @ -534,5 +550,38 @@ void Accelerator::OnCoreMapStart(edict_t *pEdictList, int edictCount, int client | |||||||
| 	strncpy(crashSourceModPath, g_pSM->GetSourceModPath(), sizeof(crashSourceModPath) - 1); | 	strncpy(crashSourceModPath, g_pSM->GetSourceModPath(), sizeof(crashSourceModPath) - 1); | ||||||
| 	strncpy(crashGameDirectory, g_pSM->GetGameFolderName(), sizeof(crashGameDirectory) - 1); | 	strncpy(crashGameDirectory, g_pSM->GetGameFolderName(), sizeof(crashGameDirectory) - 1); | ||||||
| 	strncpy(crashExtensionVersion, SMEXT_CONF_VERSION, sizeof(crashExtensionVersion) - 1); | 	strncpy(crashExtensionVersion, SMEXT_CONF_VERSION, sizeof(crashExtensionVersion) - 1); | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
|  | 	char steamInfPath[512]; | ||||||
|  | 	g_pSM->BuildPath(Path_Game, steamInfPath, sizeof(steamInfPath), "steam.inf"); | ||||||
|  | 
 | ||||||
|  | 	char steamInfTemp[256] = {0}; | ||||||
|  | 	FILE *f = fopen(steamInfPath, "rb"); | ||||||
|  | 	fread(steamInfTemp, sizeof(char), sizeof(steamInfTemp) - 1, f); | ||||||
|  | 	fclose(f); | ||||||
|  | 
 | ||||||
|  | 	// This is horrible, but I'm busy and this is
 | ||||||
|  | 	// the first thing I thought of that would work.
 | ||||||
|  | 	unsigned source = 0; | ||||||
|  | 	strcat(steamInf, "\nSteam_"); | ||||||
|  | 	unsigned target = strlen(steamInf); | ||||||
|  | 	while (true) { | ||||||
|  | 		if (steamInfTemp[source] == '\0') { | ||||||
|  | 			source++; | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		if (steamInfTemp[source] == '\r') { | ||||||
|  | 			source++; | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 		if (steamInfTemp[source] == '\n') { | ||||||
|  | 			source++; | ||||||
|  | 			if (steamInfTemp[source] == '\0') { | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 			strcat(steamInf, "\nSteam_"); | ||||||
|  | 			target = strlen(steamInf); | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 		steamInf[target++] = steamInfTemp[source++]; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | |||||||
| @ -18,9 +18,9 @@ | |||||||
| 
 | 
 | ||||||
| #define SM_BUILD_TAG		"-manual" | #define SM_BUILD_TAG		"-manual" | ||||||
| #define SM_BUILD_UNIQUEID	"[MANUAL BUILD]" | #define SM_BUILD_UNIQUEID	"[MANUAL BUILD]" | ||||||
| #define SM_VERSION			"2.2.1" | #define SM_VERSION			"2.3.0" | ||||||
| #define SM_FULL_VERSION		SM_VERSION SM_BUILD_TAG | #define SM_FULL_VERSION		SM_VERSION SM_BUILD_TAG | ||||||
| #define SM_FILE_VERSION		2,2,1,0 | #define SM_FILE_VERSION		2,3,0,0 | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1 +1 @@ | |||||||
| 2.2.1 | 2.3.0 | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
| #include "third_party/lss/linux_syscall_support.h" | #include "third_party/lss/linux_syscall_support.h" | ||||||
| 
 | 
 | ||||||
| #include <signal.h> | #include <signal.h> | ||||||
| #include <dirent.h>  | #include <dirent.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| 
 | 
 | ||||||
| static bool dumpCallback(const google_breakpad::MinidumpDescriptor &descriptor, void *context, bool succeeded) | static bool dumpCallback(const google_breakpad::MinidumpDescriptor &descriptor, void *context, bool succeeded) | ||||||
| @ -28,7 +28,6 @@ int main(int argc, char *argv[]) | |||||||
| 	// Test shit here.
 | 	// Test shit here.
 | ||||||
| 	__builtin_trap(); | 	__builtin_trap(); | ||||||
| 
 | 
 | ||||||
|         delete handler; | 	delete handler; | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 |  | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user