Flush logs when crashing.
When the process is running, we use a finally block to call Log.Dispose and flush any outstanding logs to disk before the process exits. This works when we handle any exception in a matching catch block. When the exception is unhandled, then the finally block will not run and instead the process will just exit. To fix this, flush the logs inside a catch block instead before rethrowing the error. This ensures we get logs even when crashing.
This commit is contained in:
@@ -20,25 +20,39 @@ namespace OpenRA.Launcher
|
|||||||
[STAThread]
|
[STAThread]
|
||||||
static int Main(string[] args)
|
static int Main(string[] args)
|
||||||
{
|
{
|
||||||
try
|
if (Debugger.IsAttached || args.Contains("--just-die"))
|
||||||
{
|
{
|
||||||
if (Debugger.IsAttached || args.Contains("--just-die"))
|
|
||||||
return (int)Game.InitializeAndRun(args);
|
|
||||||
|
|
||||||
AppDomain.CurrentDomain.UnhandledException += (_, e) => ExceptionHandler.HandleFatalError((Exception)e.ExceptionObject);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return (int)Game.InitializeAndRun(args);
|
return (int)Game.InitializeAndRun(args);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch
|
||||||
{
|
{
|
||||||
ExceptionHandler.HandleFatalError(e);
|
// Flush logs before rethrowing, i.e. allowing the exception to go unhandled.
|
||||||
return (int)RunStatus.Error;
|
// try-finally won't work - an unhandled exception kills our process without running the finally block!
|
||||||
|
Log.Dispose();
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Log.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AppDomain.CurrentDomain.UnhandledException += (_, e) => ExceptionHandler.HandleFatalError((Exception)e.ExceptionObject);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return (int)Game.InitializeAndRun(args);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
ExceptionHandler.HandleFatalError(e);
|
||||||
|
return (int)RunStatus.Error;
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
// Flushing logs in finally block is okay here, as the catch block handles the exception.
|
||||||
Log.Dispose();
|
Log.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,13 @@ namespace OpenRA.Server
|
|||||||
{
|
{
|
||||||
Run(args);
|
Run(args);
|
||||||
}
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Flush logs before rethrowing, i.e. allowing the exception to go unhandled.
|
||||||
|
// try-finally won't work - an unhandled exception kills our process without running the finally block!
|
||||||
|
Log.Dispose();
|
||||||
|
throw;
|
||||||
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
Log.Dispose();
|
Log.Dispose();
|
||||||
|
|||||||
@@ -44,6 +44,13 @@ namespace OpenRA
|
|||||||
{
|
{
|
||||||
Run(args);
|
Run(args);
|
||||||
}
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Flush logs before rethrowing, i.e. allowing the exception to go unhandled.
|
||||||
|
// try-finally won't work - an unhandled exception kills our process without running the finally block!
|
||||||
|
Log.Dispose();
|
||||||
|
throw;
|
||||||
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
Log.Dispose();
|
Log.Dispose();
|
||||||
@@ -133,6 +140,7 @@ namespace OpenRA
|
|||||||
if (e is NoSuchCommandException)
|
if (e is NoSuchCommandException)
|
||||||
{
|
{
|
||||||
Console.WriteLine(e.Message);
|
Console.WriteLine(e.Message);
|
||||||
|
Log.Dispose(); // Flush logs before we terminate the process.
|
||||||
Environment.Exit(1);
|
Environment.Exit(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ namespace OpenRA.WindowsLauncher
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
// Flushing logs in finally block is okay here, as the catch block handles the exception.
|
||||||
Log.Dispose();
|
Log.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user