@ -27,7 +27,8 @@ namespace Crash
CrashCatcher * CrashCatcher : : sInstance = nullptr ;
CrashCatcher * CrashCatcher : : sInstance = nullptr ;
CrashCatcher : : CrashCatcher ( int argc , char * * argv , const std : : filesystem : : path & crashLogPath )
CrashCatcher : : CrashCatcher (
int argc , char * * argv , const std : : filesystem : : path & crashDumpPath , const std : : filesystem : : path & freezeDumpPath )
{
{
assert ( sInstance = = nullptr ) ; // don't allow two instances
assert ( sInstance = = nullptr ) ; // don't allow two instances
@ -49,7 +50,7 @@ namespace Crash
if ( ! shmHandle )
if ( ! shmHandle )
{
{
setupIpc ( ) ;
setupIpc ( ) ;
startMonitorProcess ( crash Log Path) ;
startMonitorProcess ( crash DumpPath, freezeDump Path) ;
installHandler ( ) ;
installHandler ( ) ;
}
}
else
else
@ -126,7 +127,8 @@ namespace Crash
SetUnhandledExceptionFilter ( vectoredExceptionHandler ) ;
SetUnhandledExceptionFilter ( vectoredExceptionHandler ) ;
}
}
void CrashCatcher : : startMonitorProcess ( const std : : filesystem : : path & crashLogPath )
void CrashCatcher : : startMonitorProcess (
const std : : filesystem : : path & crashDumpPath , const std : : filesystem : : path & freezeDumpPath )
{
{
std : : wstring executablePath ;
std : : wstring executablePath ;
DWORD copied = 0 ;
DWORD copied = 0 ;
@ -137,14 +139,23 @@ namespace Crash
} while ( copied > = executablePath . size ( ) ) ;
} while ( copied > = executablePath . size ( ) ) ;
executablePath . resize ( copied ) ;
executablePath . resize ( copied ) ;
memset ( mShm - > mStartup . m Log FilePath, 0 , sizeof ( mShm - > mStartup . m Log FilePath) ) ;
memset ( mShm - > mStartup . m CrashDump FilePath, 0 , sizeof ( mShm - > mStartup . m CrashDump FilePath) ) ;
const auto str = crash Log Path. u8string ( ) ;
const auto str = crash Dump Path. u8string ( ) ;
size_t length = str . length ( ) ;
size_t length = str . length ( ) ;
if ( length > = MAX_LONG_PATH )
if ( length > = MAX_LONG_PATH )
length = MAX_LONG_PATH - 1 ;
length = MAX_LONG_PATH - 1 ;
strncpy_s ( mShm - > mStartup . m Log FilePath, sizeof mShm - > mStartup . m Log FilePath,
strncpy_s ( mShm - > mStartup . m CrashDump FilePath, sizeof mShm - > mStartup . m CrashDump FilePath,
Misc : : StringUtils : : u8StringToString ( str ) . c_str ( ) , length ) ;
Misc : : StringUtils : : u8StringToString ( str ) . c_str ( ) , length ) ;
mShm - > mStartup . mLogFilePath [ length ] = ' \0 ' ;
mShm - > mStartup . mCrashDumpFilePath [ length ] = ' \0 ' ;
memset ( mShm - > mStartup . mFreezeDumpFilePath , 0 , sizeof ( mShm - > mStartup . mFreezeDumpFilePath ) ) ;
const auto strFreeze = freezeDumpPath . u8string ( ) ;
length = strFreeze . length ( ) ;
if ( length > = MAX_LONG_PATH )
length = MAX_LONG_PATH - 1 ;
strncpy_s ( mShm - > mStartup . mFreezeDumpFilePath , sizeof mShm - > mStartup . mFreezeDumpFilePath ,
Misc : : StringUtils : : u8StringToString ( strFreeze ) . c_str ( ) , length ) ;
mShm - > mStartup . mFreezeDumpFilePath [ length ] = ' \0 ' ;
// note that we don't need to lock the SHM here, the other process has not started yet
// note that we don't need to lock the SHM here, the other process has not started yet
mShm - > mEvent = CrashSHM : : Event : : Startup ;
mShm - > mEvent = CrashSHM : : Event : : Startup ;
@ -204,7 +215,7 @@ namespace Crash
waitMonitor ( ) ;
waitMonitor ( ) ;
std : : string message = " OpenMW has encountered a fatal error. \n Crash log saved to ' "
std : : string message = " OpenMW has encountered a fatal error. \n Crash log saved to ' "
+ std : : string ( mShm - > mStartup . m Log FilePath)
+ std : : string ( mShm - > mStartup . m CrashDump FilePath)
+ " '. \n Please report this to https://gitlab.com/OpenMW/openmw/issues ! " ;
+ " '. \n Please report this to https://gitlab.com/OpenMW/openmw/issues ! " ;
SDL_ShowSimpleMessageBox ( 0 , " Fatal Error " , message . c_str ( ) , nullptr ) ;
SDL_ShowSimpleMessageBox ( 0 , " Fatal Error " , message . c_str ( ) , nullptr ) ;
}
}