forked from Mirrors/openclonk
Win32: optionally embed a build ID into crash dumps/minidump files
In order to get an embedded build ID, add a new CMake cache variable named OC_BUILD_ID. This variable can contain an arbitrary string, but it is suggested that you use a hierarchical string starting with your DNS domain, reversed, as in "com.example.openclonk.arbitrarystring" (think java packages).stable-5.3
parent
f1062fe1a0
commit
b73bb9cfaa
|
@ -76,7 +76,8 @@ do_subst = sed -e 's,[@]C4PROJECT[@],'"$$(sed -n 's/SET(C4PROJECT\s\+"\(.\+\)")/
|
||||||
-e 's,[@]C4XVER3[@],'"$$(sed -n 's/SET(C4XVER3\s\+\(.\+\))/\1/ p' $(srcdir)/Version.txt)"',g' \
|
-e 's,[@]C4XVER3[@],'"$$(sed -n 's/SET(C4XVER3\s\+\(.\+\))/\1/ p' $(srcdir)/Version.txt)"',g' \
|
||||||
-e 's,[@]C4XVER4[@],'"$$(sed -n 's/SET(C4XVER4\s\+\(.\+\))/\1/ p' $(srcdir)/Version.txt)"',g' \
|
-e 's,[@]C4XVER4[@],'"$$(sed -n 's/SET(C4XVER4\s\+\(.\+\))/\1/ p' $(srcdir)/Version.txt)"',g' \
|
||||||
-e 's,[@]C4VERSIONBUILDNAME[@],'"$$(sed -n 's/SET(C4VERSIONBUILDNAME\s\+"\(.\+\)")/\1/ p' $(srcdir)/Version.txt)"',g' \
|
-e 's,[@]C4VERSIONBUILDNAME[@],'"$$(sed -n 's/SET(C4VERSIONBUILDNAME\s\+"\(.\+\)")/\1/ p' $(srcdir)/Version.txt)"',g' \
|
||||||
-e 's,[@]C4VERSIONEXTRA[@],'"$$(sed -n 's/SET(C4VERSIONEXTRA\s\+"\(.\+\)")/\1/ p' $(srcdir)/Version.txt)"',g'
|
-e 's,[@]C4VERSIONEXTRA[@],'"$$(sed -n 's/SET(C4VERSIONEXTRA\s\+"\(.\+\)")/\1/ p' $(srcdir)/Version.txt)"',g' \
|
||||||
|
-e 's,[@]OC_BUILD_ID[@],,g'
|
||||||
|
|
||||||
C4Version.h: $(srcdir)/src/C4Version.h.in $(srcdir)/Version.txt
|
C4Version.h: $(srcdir)/src/C4Version.h.in $(srcdir)/Version.txt
|
||||||
$(do_subst) < $< > $@
|
$(do_subst) < $< > $@
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
* Copyright (c) 2001-2002, 2010 Peter Wortmann
|
* Copyright (c) 2001-2002, 2010 Peter Wortmann
|
||||||
* Copyright (c) 2005, 2009-2010 Günther Brammer
|
* Copyright (c) 2005, 2009-2010 Günther Brammer
|
||||||
* Copyright (c) 2009 Matthes Bender
|
* Copyright (c) 2009 Matthes Bender
|
||||||
|
* Copyright (c) 2013 Nicolas Hake
|
||||||
* Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de
|
* Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de
|
||||||
*
|
*
|
||||||
* Portions might be copyrighted by other authors who have contributed
|
* Portions might be copyrighted by other authors who have contributed
|
||||||
|
@ -71,4 +72,7 @@
|
||||||
#define C4VERSION C4XVERTOC4XVERS(C4XVER1) "." C4XVERTOC4XVERS(C4XVER2) "." C4XVERTOC4XVERS(C4XVER3) " [" C4XVER4S "]" C4VERSIONEXTRA C4BUILDOPT
|
#define C4VERSION C4XVERTOC4XVERS(C4XVER1) "." C4XVERTOC4XVERS(C4XVER2) "." C4XVERTOC4XVERS(C4XVER3) " [" C4XVER4S "]" C4VERSIONEXTRA C4BUILDOPT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// if this is set, add a build identifier to the logs and crash dumps
|
||||||
|
#define OC_BUILD_ID "@OC_BUILD_ID@"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#ifdef HAVE_DBGHELP
|
#ifdef HAVE_DBGHELP
|
||||||
|
|
||||||
// Dump generation on crash
|
// Dump generation on crash
|
||||||
|
#include <C4Version.h>
|
||||||
#include <C4windowswrapper.h>
|
#include <C4windowswrapper.h>
|
||||||
#include <dbghelp.h>
|
#include <dbghelp.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
@ -80,7 +81,12 @@ namespace {
|
||||||
#else
|
#else
|
||||||
# define POINTER_FORMAT "0x%" POINTER_FORMAT_SUFFIX
|
# define POINTER_FORMAT "0x%" POINTER_FORMAT_SUFFIX
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
LOG_STATIC_TEXT("**********************************************************************\n");
|
||||||
|
LOG_STATIC_TEXT("* UNHANDLED EXCEPTION\n");
|
||||||
|
if (OC_BUILD_ID[0] != '\0')
|
||||||
|
LOG_STATIC_TEXT("* Build Identifier: " OC_BUILD_ID "\n");
|
||||||
|
LOG_STATIC_TEXT("**********************************************************************\n");
|
||||||
// Log exception type
|
// Log exception type
|
||||||
switch (exc->ExceptionRecord->ExceptionCode)
|
switch (exc->ExceptionRecord->ExceptionCode)
|
||||||
{
|
{
|
||||||
|
@ -349,6 +355,11 @@ namespace {
|
||||||
}
|
}
|
||||||
LONG WINAPI GenerateDump(EXCEPTION_POINTERS* pExceptionPointers)
|
LONG WINAPI GenerateDump(EXCEPTION_POINTERS* pExceptionPointers)
|
||||||
{
|
{
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
MDST_BuildId = LastReservedStream + 1
|
||||||
|
};
|
||||||
|
|
||||||
if (!FirstCrash) return EXCEPTION_EXECUTE_HANDLER;
|
if (!FirstCrash) return EXCEPTION_EXECUTE_HANDLER;
|
||||||
FirstCrash = false;
|
FirstCrash = false;
|
||||||
|
|
||||||
|
@ -359,12 +370,23 @@ LONG WINAPI GenerateDump(EXCEPTION_POINTERS* pExceptionPointers)
|
||||||
// Write dump (human readable format)
|
// Write dump (human readable format)
|
||||||
SafeTextDump(pExceptionPointers, GetLogFD());
|
SafeTextDump(pExceptionPointers, GetLogFD());
|
||||||
|
|
||||||
|
MINIDUMP_USER_STREAM_INFORMATION user_stream_info = {0};
|
||||||
|
MINIDUMP_USER_STREAM user_stream = {0};
|
||||||
|
if (OC_BUILD_ID[0] != '\0')
|
||||||
|
{
|
||||||
|
user_stream.Type = MDST_BuildId;
|
||||||
|
user_stream.Buffer = &OC_BUILD_ID;
|
||||||
|
user_stream.BufferSize = sizeof(OC_BUILD_ID);
|
||||||
|
user_stream_info.UserStreamCount = 1;
|
||||||
|
user_stream_info.UserStreamArray = &user_stream;
|
||||||
|
}
|
||||||
|
|
||||||
MINIDUMP_EXCEPTION_INFORMATION ExpParam;
|
MINIDUMP_EXCEPTION_INFORMATION ExpParam;
|
||||||
ExpParam.ThreadId = GetCurrentThreadId();
|
ExpParam.ThreadId = GetCurrentThreadId();
|
||||||
ExpParam.ExceptionPointers = pExceptionPointers;
|
ExpParam.ExceptionPointers = pExceptionPointers;
|
||||||
ExpParam.ClientPointers = true;
|
ExpParam.ClientPointers = true;
|
||||||
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
|
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
|
||||||
file, MiniDumpNormal, &ExpParam, NULL, NULL);
|
file, MiniDumpNormal, &ExpParam, &user_stream_info, NULL);
|
||||||
CloseHandle(file);
|
CloseHandle(file);
|
||||||
|
|
||||||
// Pass exception
|
// Pass exception
|
||||||
|
|
Loading…
Reference in New Issue