in SDK/AppCenterCrashes/Microsoft.AppCenter.Crashes.Windows.Shared/Crashes.cs [229:287]
private Task ProcessPendingErrorsAsync()
{
return Task.Run(async () =>
{
ErrorReport lastSessionErrorReport = null;
foreach (var file in ErrorLogHelper.GetErrorLogFiles())
{
AppCenterLog.Debug(LogTag, $"Process pending error file {file.Name}");
var log = ErrorLogHelper.ReadErrorLogFile(file);
// Delete file if corrupted.
if (log == null)
{
AppCenterLog.Error(LogTag, $"Error parsing error log. Deleting invalid file: {file.Name}");
try
{
file.Delete();
}
catch (System.Exception ex)
{
AppCenterLog.Warn(LogTag, $"Failed to delete error log file {file.Name}.", ex);
}
// Also try to delete paired exception file.
if (Guid.TryParse(System.IO.Path.GetFileNameWithoutExtension(file.Name), out var id))
{
ErrorLogHelper.RemoveStoredExceptionFile(id);
}
continue;
}
// The error report cannot be built if any of those fields are null.
if (log.Device == null || log.AppLaunchTimestamp == null || log.Timestamp == null)
{
AppCenterLog.Error(LogTag, $"Error parsing error log. Deleting invalid file: {file.Name}");
RemoveAllStoredErrorLogFiles(log.Id);
continue;
}
// Build and record error report.
var report = BuildErrorReport(log);
if (lastSessionErrorReport == null || lastSessionErrorReport.AppErrorTime < report.AppErrorTime)
{
lastSessionErrorReport = report;
}
if (ShouldProcessErrorReport?.Invoke(report) ?? true)
{
_unprocessedManagedErrorLogs.Add(log.Id, log);
}
else
{
AppCenterLog.Debug(LogTag, $"ShouldProcessErrorReport returned false, clean up and ignore log: {log.Id}");
RemoveAllStoredErrorLogFiles(log.Id);
}
}
_lastSessionErrorReportTaskSource.SetResult(lastSessionErrorReport);
await SendCrashReportsOrAwaitUserConfirmationAsync().ConfigureAwait(false);
});
}